[英]Linq to Collection Where Clause Throws Exception
我有一个遍历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();
在此示例中,第一个通过循环的值是科罗拉多。 然后使用字符串whereClause = string.Format("{0} = {1}", groupBy, val);
构建Where子句whereClause = string.Format("{0} = {1}", groupBy, val);
在这种情况下, groupBy
= state和val
= colorado ..我可以通过放置断点来确认该字符串已成功构建,并且看起来像state = colorado
(我也尝试使用“ ==”而不是“ =”)。
当执行查询时,我发现一个错误,指出“ WVWellModel中没有属性或字段“ Colorado”存在”,这实际上是正确的。 我要查询的属性是“州”而不是“科罗拉多州”。 好像我的Dynamic WhereClause反转了一样。
我已将此博客用作Dynamic Linq的参考。
https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
您需要将'colorado'值放入转义的引号中,如下所示:
string whereClause = string.Format("{0} = \"{1}\"", groupBy, val);
它不会在您链接的指南中显示,因为他正在搜索的值是整数,并且-与SQL代码中的代码非常相似-您不需要在整数周围加上撇号(')。 不过,您在搜索文本时会这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.