【发布时间】:2017-01-27 00:19:44
【问题描述】:
我有一个通过 IEnumerable 循环的 foreach 循环。在循环内部,一个字符串是基于随着循环的每次迭代而变化的参数构建的。然后使用该字符串来使用动态 linq 查询。然后我想应用结果来构建自定义对象列表。 where 子句第一次执行,然后退出循环。为什么要这样做?我无法确认查询是否成功执行,但没有引发异常。
public List<groupingModel> getGrouping(string groupBy)
{
List<groupingModel> lgm = new List<groupingModel>();
var w2 = getWVWellsList();
var v = w2.Select(groupBy).Distinct();
foreach(string val in v)
{
string whereClause = string.Format("{0} = {1}", groupBy, val);
IEnumerable<WVWellModel> q2 = w2.Where(whereClause);
List<WVWellModel> l = q2.ToList<WVWellModel>();
lgm.Add(new groupingModel { Header = val, Wells = l });
}
return lgm;
}
编辑 - 捕获的异常
我将代码放入 try/catch 中并发现了一个异常,我怀疑由于动态 linq 的性质而没有被捕获。在列出异常之前,我想举一个例子。
用户选择按状态分组。这会触发一个方法,然后运行查询,但它首先根据所选属性的不同值构建一个 where 子句。这是由var v = w2.Select(groupBy).Distinct(); 完成的
在此示例中,通过循环的第一个值是 Colorado。然后用字符串whereClause = string.Format("{0} = {1}", groupBy, val); 构建Where 子句,在这种情况下groupBy = state 和val = colorado.. 我可以通过放置断点来确认字符串已成功构建并且看起来像state = colorado(我也试过这个也使用“==”而不是“=”)。
执行查询时,我发现一个错误,指出“WVWellModel 中没有属性或字段“科罗拉多”存在”,这当然是真的。我要查询的属性是“州”而不是“科罗拉多”。就好像我的 Dynamic WhereClause 被颠倒了一样......
我已将此博客用作对 Dynamic Linq 的参考。
https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
【问题讨论】:
-
为什么你的 Where 函数需要一个字符串作为参数?
-
@HungCao 类似Dynamic Linq 我想
-
我的理解是你可以使用 System.Linq.Dynamic 来做到这一点。我希望使用此功能,以便我的查询可以依赖于用户输入。
-
您的 groupby 值如何?