c # LINQ к набору данных IN предложение содержит, группа, мин - PullRequest
1 голос
/ 14 декабря 2011

Я новичок в LINQ, но пытаюсь решить сложную задачу сразу же. Я пытаюсь сделать 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()
    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 - это список строк, также созданных ранее в методе. Я создал следующий код, чтобы попытаться увидеть мои результаты, и он выдает ошибку «System.InvalidCastException» в query.Count ...

             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 ]

1 голос
/ 14 декабря 2011

Судя по исключению и трассировке стека, тип, который вы указываете для поля endID в своем запросе, не соответствует типу данных для этого столбца в DataTable.Они должны совпадать - вы не можете использовать метод Field для приведения значения к другому типу.

0 голосов
/ 14 декабря 2011

Я использовал 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)
}
...