Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表达式不能包含lambda表达式Linq_C#_Linq_Lambda_Sum - Fatal编程技术网

C# 表达式不能包含lambda表达式Linq

C# 表达式不能包含lambda表达式Linq,c#,linq,lambda,sum,C#,Linq,Lambda,Sum,我有一个数据表,我试图找到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"

我有一个数据表,我试图找到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
dtNew.AsEnumerable().Where(x=>x.Field(“ID”).ToString().StartsWith(“G”)//表达式不能包含lambda表达式
//这对我有用

dtNew.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G"));
dtNew.AsEnumerable().Where(x=>x.Field(“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"));
Random ran=new Random();
DataTable dt=新的DataTable();
dt.列。添加(“ID”);
dt.列。添加(“名称”);
添加(“响应”,类型为(Int32));
对于(int i=0;i<11;i++)
{
DataRow dr=dt.NewRow();
如果(i%2==0)
{
dr[0]=“G123”+i;
}
其他的
{
dr[0]=i;
}
dr[1]=“an”;
dr[2]=ran.Next(1100);
dt.Rows.Add(dr);
}
int结果=0;
////结果=Convert.ToInt32(dt.Compute(“sum(responding)”,“ID LIKE'G*”);
////结果=Convert.ToInt32(dt.Compute(“和(响应)”,“子字符串(ID,0,1)='G')////这会引发错误。因为索引是以1为基础的
var k=dt.AsEnumerable(),其中(x=>x.Field(“ID”).ToString().StartsWith(“G”);
//这对我有用

dtNew.AsEnumerable().Where(x => x.Field<string>("ID").ToString().StartsWith("G"));
dtNew.AsEnumerable().Where(x=>x.Field(“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"));
Random ran=new Random();
DataTable dt=新的DataTable();
dt.列。添加(“ID”);
dt.列。添加(“名称”);
添加(“响应”,类型为(Int32));
对于(int i=0;i<11;i++)
{
DataRow dr=dt.NewRow();
如果(i%2==0)
{
dr[0]=“G123”+i;
}
其他的
{
dr[0]=i;
}
dr[1]=“an”;
dr[2]=ran.Next(1100);
dt.Rows.Add(dr);
}
int结果=0;
////结果=Convert.ToInt32(dt.Compute(“sum(responding)”,“ID LIKE'G*”);
////结果=Convert.ToInt32(dt.Compute(“和(响应)”,“子字符串(ID,0,1)='G')////这会引发错误。因为索引是以1为基础的
var k=dt.AsEnumerable(),其中(x=>x.Field(“ID”).ToString().StartsWith(“G”);
您需要使用

Substring(ID,1,1) 
你需要使用

Substring(ID,1,1) 

此示例代码返回3个数据行:

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

这就是您想要的吗?

此示例代码返回3个数据行:

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

这是您想要的吗?

我怀疑您在Visual Studio“watch”窗口中执行了后者,否?
//表达式不能包含lambda表达式
此错误通常在您在watch窗口中尝试lambda时,是否直接在代码中尝试?相关线程:@har07 correction。截至2013年(含2013年)的VS在watcher中不支持lambda表达式。sustring索引以1开头,我怀疑您在Visual Studio“watch”窗口中执行了后者,否?
//表达式不能包含lambda表达式
通常在watch窗口中尝试lambda时会出现此错误,是否直接在代码中试用?相关线程:@har07更正。截至2013年(含2013年)的VS不支持watcher中的lambda表达式。sustring索引从1开始,它可以工作,因为您正在将数据枚举到集合中。这是一个解决方案,但如果表特别大,可能会很难获得资源。我建议只枚举ID,然后过滤你想要的,然后再进行第二次Where..In以取回记录。即使你在做一个额外的DB查询,它在资源上也应该更温和一些。你说的是下面这行:dt.AsEnumerable()。其中(x=>x.Field(“ID”).ToString().StartsWith(“G”))问题是AsEnumerable()立即执行一个100%的SELECT TOP。我只是在测试代码,在这种情况下我永远不会使用AsEnumerable,因为我们可以使用内置过滤器过滤记录。这只是为了验证代码,因为您正在将数据枚举到集合中。这是一个解决方案,但如果表特别大,可能会很难获得资源。我建议只枚举ID,然后过滤你想要的,然后再进行第二次Where..In以取回记录。即使你在做一个额外的DB查询,它在资源上也应该更温和一些。你说的是下面这行:dt.AsEnumerable()。其中(x=>x.Field(“ID”).ToString().StartsWith(“G”))问题是AsEnumerable()立即执行一个100%的SELECT TOP。我只是在测试代码,在这种情况下我永远不会使用AsEnumerable,因为我们可以使用内置过滤器过滤记录。这只是为了验证代码。