使用实体框架(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"的会议,而是有一个列表字符串我想要匹配的名字,这也可能吗?

谢谢你的帮助!

使用实体框架(Entity Framework)编写谓词搜索存储库时遇到麻烦(相当于使用SQL中的Join)

看起来你想要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"));
    }
}