C# 表达式不能包含lambda表达式Linq
我有一个数据表,我试图找到Id以特定值开头的列的总和。我尝试了一些方法,但得到了错误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"
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,因为我们可以使用内置过滤器过滤记录。这只是为了验证代码。