考虑这个示例数据:
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,但在引入“后无法访问它”通过...分组”?
再次感谢您提供的信息,我将标记为答案,但是如果有人可以解释对 min() (或 max 或其他)的所有调用的需要,我也将不胜感激,看看它的外观就像我的真实数据一样,这仍然是我应该走的路吗?
最佳答案
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()
或 Min()
而不是 First()
.
关于c# - 如何仅选择在一列中具有唯一值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12125864/