Linq to Clause引发异常的集合

时间:2017-01-24 21:57:47

标签: c# linq

我有一个循环遍历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

1 个答案:

答案 0 :(得分:2)

您需要将'colorado'值放在转义引号中,如下所示:

string whereClause = string.Format("{0} = \"{1}\"", groupBy, val);  

它没有显示在您链接的指南中,因为他搜索的值是整数,而且 - 就像在SQL代码中一样 - 您不需要在整数周围放置撇号(')。但是,您在搜索文本时会这样做。