【问题标题】:c# LINQ to dataset IN clause contains, group, minc# LINQ to dataset IN子句包含,组,分钟
【发布时间】:2011-12-13 23:48:52
【问题描述】:

我是 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 是该方法之前创建的字符串列表。我创建了以下代码来尝试查看我的结果,它在 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)

任何指针将不胜感激。谢谢。

【问题讨论】:

  • 您的意思是写where 而不是第一个&amp;&amp;
  • 另外,你可以写…group g by g.Field&lt;string&gt;("smID")…
  • 是的,很抱歉第一个 && 是哪里
  • 数据表中smID是string还是int?在您的原始查询中,它看起来像一个 int,但在您的 LINQ 查询中,您使用的是字符串。
  • @CollinK - 从技术上讲,它是一个字符串。它永远不会是这样,但数据库将其存储为 varchar,我们将其带到数据集定义中。

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


【解决方案1】:

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

【讨论】:

  • 你是对的。我将 'code' minEntID = rowGroup.Min(g => g.Field("entID")) 更改为 'code' minEntID = rowGroup.Min(g => Utilities.ConvertFieldtoInt(g.Field( "entID"))) 辅助方法将对象转换为 int。谢谢你的帮助。作为新手,我太专注于 LINQ,无法在框外寻找与它无关的错误。
【解决方案2】:

我使用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-06-16
    • 2010-10-25
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多