【问题标题】:LinqKit PredicateBuilder with EF 4 CPT 5 table relationships?LinqKit PredicateBuilder 与 EF 4 CPT 5 表关系?
【发布时间】:2011-02-23 20:47:34
【问题描述】:

我正在使用 LinqKit PredicateBuilder (http://www.albahari.com/nutshell/predicatebuilder.aspx) 进行搜索。这就是建立关系的方式(Entity Framework 4 CPT 5 POCO):

public class MusicSheet
{
    [Key]
    public int ID { get; set; }
    public string Title { get; set; }
    public string Key { get; set; }

    public virtual ICollection<Author> Authors { get; set; }
}

public class Author
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Bio { get; set; }

    public virtual ICollection<MusicSheet> MusicSheets { get; set; }
}

我需要能够构建一个谓词来检查 MusicSheetTitle 包含特定搜索词)以及可能还包含该搜索词的作者的 NameBio .这是我目前拥有的:

var predicate = PredicateBuilder.False<MusicSheet>();
foreach (var term in terms)
{
    string keyword = term;

    predicate = predicate
    .Or(s => s.Title.Contains(keyword));
    // TODO Check for Author Name & Bio
}

有什么建议吗?非常感谢。

【问题讨论】:

    标签: linq entity-framework-4 predicatebuilder


    【解决方案1】:

    你试过这个吗:

    var predicate = PredicateBuilder.False<MusicSheet>();
    foreach (var term in terms)
    {
       string keyword = term;
    
       predicate = predicate
          .Or(s => s.Title.Contains(keyword) ||
                   s.Authors.Any (a => a.Name.Contains(keyword) || a.Bio.Contains(keyword)));
    }
    

    【讨论】:

    • 嗨,乔,非常感谢您的帮助。我对使用“Or”方法有疑问。我应该按照您上面显示的方式进行操作,还是像这样:predicate = predicate.Or(s =&gt; s.Title.Contains(keyword)).Or(s =&gt; s.Authors.Any(a =&gt; a.Name.Contains(keyword))) ... ... 或者它们实际上是相同的(使用多个 Or||)?再次感谢。
    • 我会使用 ||尽可能使用运算符:生成的表达式树会更简单。
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多