使用实体框架(Entity Framework)编写谓词搜索存储库时遇到麻烦(相当于使用SQL中的Join)
本文关键字:麻烦 遇到 SQL Join 中的 相当于 谓词 Entity 框架 实体 Framework | 更新日期: 2023-09-27 18:16:02
我们首先使用实体框架4.1代码来持久化数据。我们的一些实体有这样的关系:
[Serializable]
public class Conference
{
private IList<Attendee> people;
private string name;
public IList<Attendee> People
{
get { return this.team; }
private set { this.team = value; }
}
public string Name
{
get { return this.name; }
private set { this.name = value; }
}
}
[Serializable]
public class Attendee
{
private string firstname;
private string surname;
public string Firstname
{
get { return this.firstname; }
private set { this.firstname = value; }
}
public string Surname
{
get { return this.surname; }
private set { this.surname = value; }
}
}
我想用LINQ查询我们的会议库。我可以使用如下搜索规范通过名称轻松找到会议:
public class ConferenceNameSearch : ISpecification<Conference>
{
public Expression<Func<Conference, bool>> IsSatisfied()
{
return a => a.Name == "Christmas Party";
}
}
但是我在编写搜索规范时遇到了真正的麻烦,该规范将返回至少有一个名字为"David"的人参加的所有会议:
public class ConferenceAttendeeNameSearch : ISpecification<Conference>
{
public Expression<Func<Conference, bool>> IsSatisfied()
{
return a => a.People.Contains( ???? err "David";
}
}
有办法做到这一点吗?此外,再复杂一级,如果不只是搜索与会者名为"David"的会议,而是有一个列表字符串
谢谢你的帮助!
看起来你想要IEnumerable<T>.Any
:
public class ConferenceAttendeeNameSearch : ISpecification<Conference>
{
public Expression<Func<Conference, bool>> IsSatisfied()
{
return a => a.People.Any(p => p.FirstName.Equals("David"));
}
}
Any
返回一个bool值,表示序列中是否有任何元素符合条件。你可以把它的行为描述为类似于sequence.Where(condition).Count() > 0
。
您应该知道的一个相关方法是IEnumerable<T>.All
(尽管这里不适用)。
试试这个:
public class ConferenceAttendeeNameSearch : ISpecification<Conference>
{
public Expression<Func<Conference, bool>> IsSatisfied()
{
return a => a.People.Where(p => p.FirstName.Equals("David"));
}
}