【问题标题】:Populating LINQ Where statement with List<class>使用 List<class> 填充 LINQ Where 语句
【发布时间】:2014-01-13 22:46:24
【问题描述】:

我正在编写一个 LINQ 表达式来查询 IQueryable。 我想从一个填充了我的自定义对象的列表中填充我的 .Where 子句。

internal class TheCustomClass
{
    public string Name { get; set; }
    public string Value { get; set; }
}

我希望 LINQ 表达式为列表中的每个项目添加 Where 子句。

动态结果如下所示:

var queryable = enumerable.Where(x => x["name1"] == "value1")
               .Where(x => x["name2"] == "value2")
               .Where(x => x["name3"] == "value3")
               ... and so on

【问题讨论】:

  • enumerable 只是一个List&lt;TheCustomClass&gt;,因为一个名为TheCustomClass 的实例x 似乎不允许索引器语法x[str]?还是enumerable 某个嵌套集合或字典?

标签: c# linq


【解决方案1】:
TheCustomClass[] filters = ...;
var queryable = enumerable.Where(x => filters.All(f => x[f.Name] == f.Value));

或者,您可以附加动态数量的 where 子句,但这似乎不必要地复杂。

如果您的查询是实际的 SQL LINQ 查询,这将不起作用。如果是这种情况,我将扩展此答案。


根据您需要 IQueryable 支持的 cmets。我们必须使用提供者可以理解的查询形状:

IQueryable<Something> q = ...; //initial query
foreach (var f in filters)
 q = q.Where(x => x[f.Name] == f.Value); //apply the filters

您的查询提供程序似乎支持x[f.Name] 语法。它是针对 Lucene/Solr 的吗?

【讨论】:

  • 感谢超快速的回答。我试过了,我得到了以下错误:“不支持的表达式节点类型:Lambda”我的代码如下所示: var queryable = linqQuery.Where(x => x.Language == language) .Where(x => facets. All(f => x[f.Name] == f.Value)) .FacetOn(x => x["制造商"]) .FacetOn(x => x["包装"]); var results = queryable.GetResults();
  • 您使用的是什么 ORM?什么是 FacetOn?
  • 太棒了,最后一部分做到了!谢谢
  • 这是对 Sitecore API 的搜索,底层搜索提供者是 Lucene,但 Sitecore 在一个非常漂亮的界面中抽象了所有搜索功能。可能有一种更简单的方法来做我一直在尝试的事情,但这是一个快速而肮脏的解决方案。
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多