C# 使用distinct()时不返回distinct记录

C# 使用distinct()时不返回distinct记录,c#,linq,entity-framework,linq-to-entities,distinct,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"

使用以下代码,我无法在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;
使用上面的数据,我得到了5条记录,而我预期是2条


ID字段是数据库中的一个字符串。

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

顺便问一下,数据库如何决定应该返回具有给定
键的

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

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

根据这样的问题,LINQ对实体和
不同的
存在已知问题。请尝试该查询:

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

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

顺便问一下,数据库如何决定应该返回具有给定
键的

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

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

根据这样的问题,LINQ对实体和
不同的
存在已知问题。请尝试该查询:

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

您告诉它您想要一个独特的
服务
对象列表,而不是服务ID(或名称)列表

我不熟悉以编程方式构建谓词,但我认为您应该这样做:

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

您告诉它您想要一个独特的
服务
对象列表,而不是服务ID(或名称)列表

我不熟悉以编程方式构建谓词,但我认为您应该这样做:

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

我不确定我是否理解你的最后一个问题。我想我的意思是,你没有提供信息来建议(而且无法推断),对于ID=400和ID=401,哪种服务是正确的。确定不希望使用Group By而不是Distinct吗?我希望它的行为方式与SQL Distinct相同。我不关心服务数据,我只想要唯一的ID。使用ToList()进行了更改,但它仍然返回重复的ID。是的,但这样做,您将从数据库中获取所有
ID
s,并且
Distinct
部分由应用程序计算。我很确定我的版本应该有效…我不确定我是否理解你的最后一个问题。我想我的意思是,你没有提供信息来建议(并且无法推断),对于ID=400和ID=401,哪种服务是正确的。确定不希望使用Group By而不是Distinct吗?我希望它的行为方式与SQL Distinct相同。我不关心服务数据,我只想要唯一的ID。使用ToList()进行了更改,但它仍然返回重复的ID。是的,但这样做,您将从数据库中获取所有
ID
s,并且
Distinct
部分由应用程序计算。我非常确定我的版本应该可以工作……我尝试将.Distinct()移动到示例中的位置,它返回相同的记录计数。似乎合乎逻辑但不起作用。你期望结果是什么?身份证列表?服务对象列表?另外,请尝试在
Distinct()
之后添加
.ToArray()
.ToList()
。我希望确保查询已实际执行。我希望得到一个不同ID的列表,而不是一个具有重复ID的列表。添加了ToList()后,我仍然得到了DUP。我已尝试将.distinct()移动到示例中的位置,它返回相同的记录计数。似乎合乎逻辑但不起作用。你期望结果是什么?身份证列表?服务对象列表?另外,请尝试在
Distinct()
之后添加
.ToArray()
.ToList()
。我希望确保查询已实际执行。我希望得到一个不同ID的列表,而不是一个包含重复ID的列表。添加了一个ToList()后,我仍然会得到DUP。