【问题标题】:Filter in linq with ID's in a List<int>使用 List<int> 中的 ID 在 linq 中过滤
【发布时间】:2015-04-13 06:24:12
【问题描述】:

我需要做一个过滤器来请求包含在列表中的参数的数据。

if (filter.Sc.Count > 0)
    socios.Where(s => filter.Sc.Contains(s.ScID));

我尝试过这种方式,但这不起作用,我也尝试过......

socios.Where( s => filter.Sc.All(f => f == s.ScID));

我怎样才能做这样的过滤器?

【问题讨论】:

  • 你的Sc会员是什么类型的?
  • 有异常吗?可能您需要添加.ToList()
  • 最后添加.ToList()
  • 当您说它不起作用时,您是什么意思?你的意思是它不编译?你的意思是它会引发错误吗?你的意思是它运行但实际上并没有按照你的意愿过滤吗?更清楚到底是什么问题,你更有可能得到一个很好的答案来解决你的问题。此外,它可能值得告诉我们所涉及的类型是什么。比如什么是socios(IEnumerable?IQueryable?)和什么是filter.Sc...
  • Sc 是一个 List,我在 if 后面加上 .ToList。结果是所有的社会,而不仅仅是 Sc 列表中的 socials.ScID

标签: c# linq asp.net-mvc-5


【解决方案1】:
socios.Where(s => filter.Sc.Contains(s.ScID));

返回一个过滤的查询。它不会修改查询。您忽略了返回的值。你需要这样的东西:

socios = socios.Where(s => filter.Sc.Contains(s.ScID));

但根据socios 的类型,确切的语法可能会有所不同。

【讨论】:

  • 好眼光!发现得好。 :)
【解决方案2】:

除了需要使用 LINQ .Where() 的返回值之外,您的第二条语句中还有潜在的逻辑错误。 .Contains() 的等效逻辑是检查元素的 Any 是否通过匹配条件。在您的情况下,第二个语句将是

var filteredSocios = socios.Where( s => filter.Sc.Any(f => f == s.ScID));

当然如果你可以直接比较object-to-object,.Contains()还是足够的,只要你记得使用返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多