【问题标题】:Expression can not contain lambda expression Linq表达式不能包含 lambda 表达式 Linq
【发布时间】:2015-05-25 06:47:10
【问题描述】:

我有数据表,我正在尝试查找 Id 以特定值开头的列的总和。我尝试了一些方法但出现错误。

result=Convert.ToInt32(dtNew.Compute("Sum(ResPending)", "Substring(ID,0,1)='G'"));//error shows-- Substring() argument is out of range

也尝试过这种方式

dtNew.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G"));//Expression can not contain lambda expression

【问题讨论】:

标签: c# linq lambda sum


【解决方案1】:

你需要使用

Substring(ID,1,1) 

【讨论】:

    【解决方案2】:
    result = Convert.ToInt32(dt.Compute("sum(ResPending)", "ID LIKE 'G*'"));
    

    //这对我有用。

    dtNew.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G"));
    

    这也有效。

    下面是测试代码:

     Random ran = new Random();
            DataTable dt = new DataTable();
            dt.Columns.Add("ID");
            dt.Columns.Add("Name");
            dt.Columns.Add("ResPending", typeof(Int32));
            for (int i = 0; i < 11; i++)
            {
                DataRow dr = dt.NewRow();
                if (i % 2 == 0)
                {
                    dr[0] = "G123" + i;
                }
                else
                {
                    dr[0] = i;
                }
    
                dr[1] = "an";
                dr[2] = ran.Next(1, 100);
                dt.Rows.Add(dr);
            }
    
            int result = 0;
            //// result =  Convert.ToInt32(dt.Compute("sum(ResPending)", "ID LIKE 'G*'"));
            ////result   = Convert.ToInt32(dt.Compute("Sum(ResPending)", "Substring(ID,0,1)='G'")); ////this throws error. as index is 1 based
            var k  = dt.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G"));
    

    【讨论】:

    • 之所以有效,是因为您将数据枚举到一个集合中。这是一个解决方案,但如果表特别大,可能会占用资源。我建议只枚举 ID,然后过滤你想要的那些,然后再做第二个 Where..In 来取回记录。即使您正在执行额外的数据库查询,它也应该对资源更加温和。
    • 你说的是下面一行:dt.AsEnumerable().Where(x => x.Field("ID").ToString().StartsWith("G"))跨度>
    • 问题是 AsEnumerable() 立即执行 SELECT TOP 100 PERCENT。
    • 我只是在测试代码,在这种情况下我永远不会使用 AsEnumerable,因为我们可以使用内置过滤器过滤记录。只是为了验证代码。
    【解决方案3】:

    此示例代码返回 3 DataRows:

    var coll = dt.AsEnumerable().Where(k => k.Field<string>(0).Contains("G")).Select(p => p).ToList();
    

    这是你想要的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-21
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多