我有一个循环遍历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);
= state和groupBy
= colorado中使用字符串val
构建Where子句。我可以通过放置断点来确认字符串是否已成功构建并且看起来像{{ 1}}(我也尝试使用“==”而不是“=”)。
当执行查询时,我捕获一条错误,指出“没有属性或字段”科罗拉多“存在于WVWellModel中”,这当然是真的。我试图查询的属性是“State”而不是“Colorado”。就好像我的Dynamic WhereClause被颠倒了一样......
我使用此博客作为Dynamic Linq的参考。
https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
答案 0 :(得分:2)
您需要将'colorado'值放在转义引号中,如下所示:
string whereClause = string.Format("{0} = \"{1}\"", groupBy, val);
它没有显示在您链接的指南中,因为他搜索的值是整数,而且 - 就像在SQL代码中一样 - 您不需要在整数周围放置撇号(')。但是,您在搜索文本时会这样做。