简体   繁体   English

如何使用LINQ和PredicateBuilder使用子类构建谓词?

[英]How to use LINQ and PredicateBuilder to build a predicate using a subclass?

I am trying to use this answer to dynamically add an OR operator to the WHERE clause in LINQ: https://stackoverflow.com/a/782350/1316683 我正在尝试使用此答案向LINQ中的WHERE子句动态添加OR运算符: 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);

In my case Tags is a List<Tag>, not a property, I would like to do something like this: 在我的情况下,Tags是一个List <Tag>,而不是属性,我想这样做:

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

Then I thought of something like this, which doesn't work: 然后我想到了这样的东西,它不起作用:

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

Is this possible? 这可能吗?

Yes, it should be possible: 是的,应该有可能:

  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());

With Songs and Tag defined as: SongsTag定义为:

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

  public class Tag {
    public string TagName { get; set; }
  }

Then, res contains the first 3 records defined in songs as expected. 然后, res包含在songs定义的前3条记录(按预期)。

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

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