繁体   English   中英

使用Linq Lambda按字符串子对象属性过滤实体对象列表

[英]Filter list of entity objects by string child object property using Linq Lambda

我正在尝试返回由子对象属性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);

它仅适用于小型列表,但对于具有数千条记录的某些列表,它会给出超时。

嗯,可能导致速度问题的一个问题是您的lambda版本和非lambda版本做的事情大不相同。 您不是lambda,正在使用联接一侧的where进行联接。

为什么不只写等效的lambda?

var list = db.Lands.Join(db.Owners.Where(x=> x.Name.Contains("Smit")), a=> a.Id, b => b.LandId, (a,b) => a).toList();

我的意思是,这比您的非lambda更直接

我认为您可以使用以下一种:

var list = db.Lands.Where(lnd => lnd.Owners.Any(x => x.Name.Contains("Smit")));

尝试一些更简单的方法:

var lands = db.Owners.Where(o => o.Name.Contains("Smit")).Select(o => o.Lands);

您只需要确保Owner.Name不为null,其余的将由LINQ完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM