c#LINQ到子句contains、group、min中的数据集
我是新来林克的,但我正试图一下子解决一个棘手的问题。我正在尝试对数据集执行LINQ并模拟以下查询c#LINQ到子句contains、group、min中的数据集,c#,linq,group-by,contains,linq-to-dataset,C#,Linq,Group By,Contains,Linq To Dataset,我是新来林克的,但我正试图一下子解决一个棘手的问题。我正在尝试对数据集执行LINQ并模拟以下查询 SELECT smID, MIN(entID) FROM table WHERE exID = :exID AND smID IN (1,2,3,4,5,6,7,8, etc) GROUP BY smID 到目前为止,我的代码如下 DataTable dt = ds.Tables["myTable"]; var query = from g in dt.AsEnumerable()
SELECT smID, MIN(entID) FROM table
WHERE exID = :exID
AND smID IN (1,2,3,4,5,6,7,8, etc)
GROUP BY smID
到目前为止,我的代码如下
DataTable dt = ds.Tables["myTable"];
var query =
from g in dt.AsEnumerable()
where g.Field<string>("exID") == exID
&& smIDs.Contains(g.Field<string>("smID"))
group g by g.Field<string>("smID") into rowGroup
select new
{
smID = rowGroup.Key,
minEntID = rowGroup.Min(g => g.Field<int>("entID"))
};
我一直不知道我做错了什么
VS指向
minEntID = rowGroup.Min(g => g.Field<int>("entID"))
任何指点都将不胜感激。谢谢。我以前经常想到以下代码:
from t in db.Table // your C# table / collection here, of course
where t.ExId == stackoverflow.ExId
&& (new int[] {1, 2, 3 }).Contains(t.SmId)
group t by new { t.SmId } into g
select new {
SmId = g.Key.SmId,
minEntID = g.Min(p => p.EntId)
}
我曾经想出过这样的代码:
from t in db.Table // your C# table / collection here, of course
where t.ExId == stackoverflow.ExId
&& (new int[] {1, 2, 3 }).Contains(t.SmId)
group t by new { t.SmId } into g
select new {
SmId = g.Key.SmId,
minEntID = g.Min(p => p.EntId)
}
根据异常和堆栈跟踪判断,您为查询中的endID字段指定的类型与DataTable中该列的数据类型不匹配。这些必须匹配--您不能使用Field方法将值强制转换为其他类型。根据异常和堆栈跟踪判断,您在查询中为endID字段指定的类型与DataTable中该列的数据类型不匹配。这些必须匹配--您不能使用Field方法将值强制转换为其他类型。您是想在其中写入
而不是第一个&&
?此外,您可以只写入…按g.Field分组g(“smID”)…
。是的,很抱歉,第一个&&是数据表中的smID是字符串还是int?在原始查询中,它看起来像一个int,但在LINQ查询中,您使用的是字符串。@collik-从技术上讲,它是一个字符串。它永远不会是这样,但DB将其存储为varchar,我们将其添加到数据集定义中。您是否打算在其中写入而不是第一个&&
?此外,您可以只写入…group g by g.Field(“smID”)…
。是的,很抱歉,第一个(&I)是数据表中的字符串或int?在原始查询中,它看起来像一个int,但在LINQ查询中,您使用的是字符串。@collik-从技术上讲,它是一个字符串。它永远不会是这样的,但DB将其存储为varchar,我们将其添加到数据集定义中。您是正确的。我将'code'minEntID=rowGroup.Min(g=>g.Field(“entID”))更改为'code'minEntID=rowGroup.Min(g=>Utilities.ConvertFieldtoInt(g.Field(“entID”))helper方法将对象转换为int。感谢您的帮助。作为一个新手,我太专注于LINQ了,以至于无法从盒子外面寻找与之无关的错误。你是对的。我将'code'minEntID=rowGroup.Min(g=>g.Field(“entID”))更改为'code'minEntID=rowGroup.Min(g=>Utilities.ConvertFieldtoInt(g.Field(“entID”))helper方法将对象转换为int。感谢您的帮助。作为一个新手,我太专注于LINQ了,以至于无法从盒子外面寻找与之无关的错误。
from t in db.Table // your C# table / collection here, of course
where t.ExId == stackoverflow.ExId
&& (new int[] {1, 2, 3 }).Contains(t.SmId)
group t by new { t.SmId } into g
select new {
SmId = g.Key.SmId,
minEntID = g.Min(p => p.EntId)
}