1

私は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"))

これは、スタック トレースの最初の 2 行です...

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

どんなポインタでも大歓迎です。ありがとう。

4

2 に答える 2

1

例外とスタック トレースから判断すると、クエリの endID フィールドに指定している型が、DataTable のその列の DataType と一致しません。これらは一致する必要があります。Field メソッドを使用して値を別の型にキャストすることはできません。

于 2011-12-14T01:21:03.797 に答える
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)
}
于 2011-12-14T00:58:29.393 に答える