【问题标题】:Linq to Collection Where Clause Throws ExceptionLinq to Collection Where 子句抛出异常
【发布时间】: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 值如何?

标签: c# linq


【解决方案1】:

您需要将“colorado”值放在转义引号内,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多