2

考虑这个示例数据:

field1  field2  
1       100  
2       100  
3       101  
4       102  
5       102  
6       103   

我只想选择其中值field2仅出现一次的记录。上述所需返回数据的一个示例是:

field1  field2  
3       101  
6       103   

这将如何使用 LINQ to SQL 完成?

--- 编辑 -------
大家好,谢谢您的回复。我特意提供了简化的数据来找到我问题的根源。我认为所有这些答案都会根据我的示例数据返回所需的结果,我会将它们标记为所有答案。

但是在我的真实数据场景中,使用我从您的回复中学到的东西,我有这样的事情:

var RefinedSource =  from a in dSource
                     group a by a.AssetID into g
                     where g.Count() == 1
                     select new
                     {
                          AssetID = g.Key,
                          AssetType = g.Min(a => a.AssetType),
                          IPInfo = AppUtility.GetIPInfo(g.Key),
                          Hostname = AppUtility.GetServerName(g.Key),
                          DeviceID = g.Min(a => a.DeviceID).ToString(),
                          Environment = AppUtility.GetSolutionAndEnvironmentNames(g.Key),
                          Manufacturer = g.Min(a => a.Manufacturer),
                          MakeModel = g.Min(a => a.MakeModel),
                          Location = g.Min(a => a.Location),
                          count = g.Count()
                     };

所以我担心所有的 .min() 调用......我推断这些是必要的,因为分组?有人可以解释为什么需要这些吗?在我的简单示例中,我认为它们不是问题,但是对于我的真实数据,多次调用 min() 只是为了能够包含我需要的所有字段数据......这似乎不是好的。

分组允许我测试我需要的条件(用于识别重复值的计数),但我如何更直接地使用这样的条件,而只是直接访问我真正的基础数据行?

例如,看看我刚才提供的示例,我希望能够只使用原始“from a in dSource”部分中的 a.FieldName,但是在引入“group by”之后您将无法访问它?

再次感谢您提供的信息,我将标记为答案,但是如果有人可以解释对 min() (或 max 或其他)的所有调用的需要,我也会很感激它,看看我的真实数据,这仍然是我应该走的路吗?

4

3 回答 3

1

下面是它在 SQL 中的实现方式(有时使用 SQL 更快):

 SELECT max(field1), field2
 FROM table
 GROUP BY field2
 HAVING count(field2) = 1

在 sql server 中使用窗口函数的示例
(注意,现在无法测试 OVER 子句可能需要在 where 中):

 SELECT COUNT() OVER(PARTITION BY field2) AS [field2Count], *
 FROM table
 WHERE [field2Count] = 1 
于 2012-08-25T21:43:48.403 回答
1
from r in tables
  group r.field2 by r.field1 into grp
  where grp.Count() == 1
  select new {grp.First(), grp.Key}

我会仔细检查这是否执行了一个 SQL 调用。它应该,如果是这样,我会把它保留在这里,因为它First是一种非常常用的 Linq 方法,并且当在给定的情况下有几十个同样好的东西可以使用时,应该喜欢熟悉的。如果它确实导致了多个 SQL 调用(同样,我会感到惊讶),然后尝试使用Max()orMin()而不是First().

于 2012-08-25T21:48:00.337 回答
0

LINQ可以简单地做:

var groups = list.GroupBy(r => r.Value).Where(grp => grp.Count() == 1);

foreach(var gr in groups){
   var field1 = gr.Key;      // KEY: is your FIELD1
   var field2 = gr.Value;    // VALUE: is your FIELD2
}
于 2012-08-25T21:52:10.080 回答