【发布时间】:2019-05-15 11:51:02
【问题描述】:
我正在尝试返回由子对象属性 Owner.Name 过滤的 IQueryable 土地。与查询样式解决方案配合良好,但我想使用 lambda 解决方案。
简而言之,这些是我由 EntityFramework 映射的类:
public class Land
{
public int Id { get; set; }
public virtual ICollection<Owner> Owners { get; set; }
}
public class Owner
{
public int Id { get; set; }
public string Name { get; set; }
public int LandId { get; set; }
public virtual Land Lands { get; set; }
}
运行良好的查询:
var list = from land in db.Lands
join owner in db.Owners on land.Id equals Owner.LandId
where owner.Name.Contains("Smit")
select land;
我正在尝试使用这个:
var list = db.Lands.Where(lnd => lnd.Owners.Count() > 0 &&
lnd.Owners.Where(own => own.Name.Contains("Smit")).Count() > 0);
它只适用于小列表,但对于一些有数千条记录的列表,它会超时。
【问题讨论】:
-
owner.Name的属性是从哪里来的? -
最好将数据重新排列到像 Lookup 这样的数据结构中,这会使您的查询速度更快,您当前的查询的时间复杂度为 O(N^2),这简直是致命的大量数据的性能,1000 条记录的复杂性变为 100 万次迭代
-
在实际的Query版本中,你使用的是Join,那为什么不加入Lambda查询,势必会产生影响
标签: c# entity-framework linq lambda