c#LINQ to dataset IN子句包含,group,min

时间:2011-12-13 23:48:53

标签: c# linq group-by contains linq-to-dataset

我是LINQ的新手,但我正在努力解决一个艰难的问题。我正在尝试LINQ to dataset并模拟以下查询......

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"))
    };

exID 是方法中的字符串变量, smIDs 是先前在方法中创建的字符串列表。我创建了以下代码来尝试查看我的结果,并在query.Count中抛出“System.InvalidCastException”错误...

             if (query.Count() > 0)
             {
                 foreach (var item in query)
                 {
                     string s = item.smID;
                     int i = (int)item.minEntID;
                 }
             }

我一直无法弄清楚我做错了什么。

VS指向......

minEntID = rowGroup.Min(g => g.Field<int>("entID"))

这是堆栈跟踪的前两行...

   at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)
   at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)

任何指针都会非常感激。感谢。

2 个答案:

答案 0 :(得分:1)

根据异常和堆栈跟踪判断,您在查询中为endID字段指定的类型与DataTable中该列的DataType不匹配。这些必须匹配 - 您不能使用Field方法将值转换为其他类型。

答案 1 :(得分:0)

我使用Linqer来提供此代码:

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)
}