使用Distinct()时不返回不同的记录

时间:2013-03-15 21:10:29

标签: c# linq entity-framework linq-to-entities distinct

使用以下代码我没有获得ID上的记录。这是为什么?

List<string> products = new List<string>();
products.Add("13CONV");
products.Add("12CONV");
products.Add("11CONV");
products.Add("10CONV");
products.Add("09CONV");
products.Add("08CONV");
products.Add("07CONV");

var predicate = PredicateBuilder.True<Services>()
                                .And(m => products.Contains(m.Service));

var Results = from d in Services.Distinct()
                                .Where(predicate )
              select d.ID;

数据库表(服务)是:

ID         Service
==
400        13Conv
401        13Conv
400        12Conv
400        07Conv
400        11Conv

使用上面的数据,当我预期为2时,我会得到5条记录。

ID字段是DB中的字符串。

2 个答案:

答案 0 :(得分:2)

它是Distinct,而不是DistinctByKey(LINQ中不存在这样的方法),因此检查行中的所有值是否相等。通过该检查,非行数相等。这就是为什么它们都是通过查询返回的。

顺便说一下 - 数据库将如何决定,应返回给定Key的哪一行?

如果您尝试仅接收ID,并且它们应该是独特的,请尝试该查询:

var results = Services.Where(predicate).Select(s => s.ID).Distinct().ToList();

<强>更新

根据像this one这样的问题,LINQ to Entites和DISTINCT存在已知问题。请尝试该查询:

Services.Where(predicate).GroupBy(s => s.Id).Select(g => g.Key).ToList();

答案 1 :(得分:1)

你告诉它你需要一个明确的Service对象列表,而不是服务ID(或名称)。

我不熟悉以编程方式构建谓词,但我认为你会做这样的事情:

var Results = (from d in Services.Where(Predicate)
               select d.ID).Distinct();