linq 如何 < string>用C#在EF的IQueryable中查找字符串字段中< Entity>的List?

0yg35tkg  于 2023-02-27  发布在  C#
关注(0)|答案(2)|浏览(157)

我正在使用.Net 6和EF Core 6。假设我有一个包含字符串属性的实体,并且我有一个字符串变量的动态列表,我想使用LINQ找出我的表特定列的哪些记录包含至少一个这些单词。

我的实体是:

Public class Sample
{
    public int Id { get; set; }
    public string Caption { get; set; }
}

字符串单词列表为:

List<string> words;

我使用下面的代码来得到结果:

var query = _sampleRepository.AsQueryable().AsNoTracking(); // the type is IQueryable<Sample>

query = query.Where(x => words.Any(word => x.Caption.Contains(word)));

query = query.OrderByDescending(x => x.Id).Skip(50).Take(20);

query = query.ToList();

但在执行上述代码时,我会得到一个 Exception,表示以下代码的一部分:
查询。其中(x =〉单词。任何(单词=〉x.标题。包含(单词)))无法被EF转换为这样的查询以从数据库获取数据!
我实际上想要,我应该使用LINQ来做这件事,它不可能使用,例如connection.QuerySingleOrDefaultAsync方法或其他。
请帮帮我!

2ic8powd

2ic8powd1#

由于EF无法转换放在“where”中的“any”中的嵌套“contains”,因此需要使用 predicate 并将其传递给where子句

var query = _sampleRepository.AsQueryable().AsNoTracking(); // the type is IQueryable<Sample>
Expression<Func<Sample, bool>> predicate = (Sample) => false;
foreach(var word in words)
    predicate = predicate.Or(x => x.Caption.Contains(word));
query= query.Where(predicate);
query = query.OrderByDescending(x => x.Id).Skip(50).Take(20);
query = query.ToList();
sh7euo9m

sh7euo9m2#

我终于找到了解决办法!
我应该使用**LinqKit金块包**来帮助我做到这一点!
这是解决方案代码:

var pb = PredicateBuilder.New<Sample>();
foreach (var word in words)
{
    pb = pb.Or(x => x.Caption.Contains(word));
}
query = query.Where(pb);

我需要LinqKit来使用PredicateBuilder,上面的代码应该替换为query = query.Where(x => words.Any(word => x.Caption.Contains(word)));,它对我很有效!

相关问题