【问题标题】:How to use LINQ and PredicateBuilder to build a predicate using a subclass?如何使用 LINQ 和 PredicateBuilder 使用子类构建谓词?
【发布时间】:2015-07-31 05:50:57
【问题描述】:

我正在尝试使用此答案将 OR 运算符动态添加到 LINQ 中的 WHERE 子句:https://stackoverflow.com/a/782350/1316683

var searchPredicate = PredicateBuilder.False<Songs>();

foreach(string str in strArray)
{
    var closureVariable = str;
    searchPredicate = 
     searchPredicate.Or(SongsVar => SongsVar.Tags.Contains(closureVariable));
}

var allSongMatches = db.Songs.Where(searchPredicate);

在我的情况下,标签是一个列表,而不是一个属性,我想做这样的事情:

searchPredicate.Or(SongsVar => SongsVar.Tags.Any().TagName.Contains(closureVariable));

然后我想到了这样的东西,它不起作用:

searchPredicate.Or(x => x.Tags.Where(p => p.TagName.Contains(closureVariable )).Count() > 0);

这可能吗?

【问题讨论】:

    标签: c# linq predicatebuilder


    【解决方案1】:

    是的,应该可以的:

      var searchPredicate = PredicateBuilder.False<Songs>();
    
      var strArray = new[] {"aa", "bb"};
    
      foreach (string str in strArray) {
        var closureVariable = str;
        searchPredicate =
         searchPredicate.Or(songsVar => songsVar.Tags.Any(tagVar => tagVar.TagName == closureVariable));
      }
    
      var songs = new List<Songs> {
        new Songs {Tags = new List<Tag> {new Tag {TagName = "aa"}}},
        new Songs {Tags = new List<Tag> {new Tag {TagName = "bb"}}},
        new Songs {Tags = new List<Tag> {new Tag {TagName = "aa"}, new Tag {TagName = "cc"}}},
        new Songs {Tags = new List<Tag> {new Tag {TagName = "cc"}, new Tag {TagName = "dd"}}}
      };
    
      var res = songs.Where(searchPredicate.Compile());
    

    SongsTag 定义为:

      public class Songs {
        public List<Tag> Tags { get; set; }
      }
    
      public class Tag {
        public string TagName { get; set; }
      }
    

    然后,res 包含 songs 中定义的前 3 条记录,如预期的那样。

    【讨论】:

    • 嗨@HashPsi。我正在尝试使用PredicateBuilder,但不断得到它在当前上下文中不存在。我假设它是System.Linq 指令的一部分?我错过了什么吗?
    • @Jawad 有几个PredicateBuilder 的实现。参见例如github.com/scottksmith95/LINQKit
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2017-09-26
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多