【问题标题】:What is the syntax for a LINQ filter for List<string>?List<string> 的 LINQ 过滤器的语法是什么?
【发布时间】:2020-03-12 03:57:42
【问题描述】:

我有一个使用 EF Core 的 C# 程序。

我这样获取我的记录:

List<MyEntity> candidateRecords = await myFilters.ToListAsync();

我这样构建过滤器:

IQueryable<MyEntity> myFilters = from m in context.MyEntity
                                 select m;
if (!string.IsNullOrEmpty(criterion1))
   myFilters = myFilters.Where(s => s.SomeColumn.Contains(criterion1));
if (!string.IsNullOrEmpty(criterion2))
   myFilters = myFilters.Where(s => s.SomeColumn.Contains(criterion2));
   ...

这一切都有效。我可以选择单个值的任何标准组合,例如criterion s.Color = "Blue".

但是过滤 LIST 的所有匹配项的语法是什么?

示例(无法正常工作):

  List<string> selectedNames = new List<string>() {"Huey", "Dewey", "Louie"}:
  if (!string.IsNullOrEmpty(criterionX)) 
  {
       myFilters = myFilters.Where(
         record => selectedNames.Contains(record.Name));
       ...

假设所有三个名称都有多条记录。上面的例子只会返回“Huey”的记录;没有返回“Dewey”或“Louie”的记录。

问题:

返回 ALL 列表中 EVERY 名称的匹配记录的正确 LINQ 语法是什么?

【问题讨论】:

  • selectedNames.Contains(record.Name) 在我看来是正确的。您可以为您提到的“没有返回记录”行为写一个重现吗?我不明白为什么你没有匹配到“Dewey”或“Louie”。
  • .Where(x =&gt; someList.Contains(x.SomeValue)) 确实是正确的方法,所以我怀疑您的测试/验证中可能有其他问题。您如何确认这一点?
  • select * from M Record where Record.Name in ('Huey', 'Dewey', 'Louie') 看起来是否正确并返回正确的结果? 在 SQL 中

标签: c# linq entity-framework-core


【解决方案1】:

据我了解,您希望获得与原版等效的东西

 myFilters = myFilters.Where(s => s.SomeColumn.Contains(criterion1));

只是一个标准列表。

那么应该是这样的

myFilters = myFilters
    .Where(record => 
        selectedNames
            .Any(selectedName => 
                 record.Name.Contains(selectedName)));

使用Any 扩展方法。

【讨论】:

  • 仅供参考,原来的 LINQ,selectedNames.Contains(record.Name) 是正确的。问题实际上是一些与“名称”如何输入数据库无关的问题。
  • @FoggyDay 您可以添加自己的答案,在那里解释问题并将其标记为答案。尽管对于这样的“外部问题”问题,不幸的是,我和你的答案对未来的读者都没有多大用处,但至少你找到了问题的根源是件好事。 P.S.:还可以建议在您未来的问题中添加“测试用例”/minimal reproducible example - 他们经常帮助我用我自己的代码诊断问题,而无需发布/为那些在发布时试图回答此类问题的人简化任务。
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2013-03-30
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多