Linq:如何以表/列表作为参数优化请求

本文关键字:参数 优化 请求 列表 Linq | 更新日期: 2023-09-27 18:30:46

我有一个我经常在 Linq 中使用的请求:

我需要一组数据,这些数据在项目列表中具有其ID(或任何其他字段)。这是一个繁重的请求,因为我有很多(使用过的)包含来加载数据。

举个例子:

我有一个与人有的桌子,具有这种结构:

Id; Name; Age; ...

这个表是几个用外键链接的表,我需要加载这些数据:汽车, 公司, 地址, ...

现在我想检索具有特殊年龄的人的所有数据:

List<int> ages = new List<int>(){7,17,27,37,47,57,67,77,87};
using (MyDatabaseEntities context = new MyDatabaseEntities ())
{
   return context.Persons.Include("Car").Include("Company").Include("Address")
                 .Where(p=>ages.Contains(p.Age)).ToList();
}

问题是我的印象是Linq不知道我的"年龄"列表不会改变,然后下载完整的人员列表,以及他们的所有数据(汽车,公司,...),然后检查每个结果是否有正确的年龄。

所以。

  1. 我说的对吗?
  2. 如何避免这种情况?

Linq:如何以表/列表作为参数优化请求

你可以像这样使用投影:

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
   return context.Persons
    .Where(p => ages.Contains(p.Age))
    .Select(p => new {p, p.Car, p.Company, p.Address})
    .ToList();
}
  1. 我认为你错了:虽然你没有"枚举"你的查询(在你的情况下调用"ToList()"之前),但你不会"不加载"任何东西。但是 sql 生成的代码可能没有那么高性能。

您可以尝试调试代码:Sql Profiler,或者只是

var yourQuery = context.Persons.Include("Car").Include("Company").Include("Address")
                 .Where(p=>ages.Contains(p.Age));
var HarmQuery = context.Persons
    .Where(p => ages.Contains(p.Age))
    .Select(p => new {p, p.Car, p.Company, p.Address});

return yourQuery.ToList();

在"var query"上放一个分解,然后看到生成的 sql,复制它并在您的数据库指导中尝试它,并检查两者的性能。

编辑:如果您只需要"链接"实体的属性子集,投影肯定比包含更好:

.Select(p => new{p, p.Car.Name, p.Company.Id, p.Address.Street, p.Address.StreetNumber)

你不能用"include"做什么,它检索所包含实体的所有属性。