【问题标题】:Not returning distinct records when use Distinct()使用 Distinct() 时不返回不同的记录
【发布时间】:2013-03-15 21:10:28
【问题描述】:

使用以下代码,我没有在 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

使用上面的数据,我得到了 5 条记录,而我预计是 2 条。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    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();
    

    【讨论】:

    • 不确定我是否理解您的最后一个问题。
    • 我认为我的意思是您没有提供建议的信息(并且无法推断),对于 ID=400 和 ID=401,哪个服务是正确的.确定不想使用 Group By 而不是 Distinct?
    • 我希望它的行为方式与 SQL Distinct 相同。我不关心服务数据,我只想要唯一的 ID。
    • 使用 ToList() 进行了更改,但仍然返回重复项。
    • 是的,但是通过这样做,您将从数据库中获取所有IDs,并且Distinct 部分由应用程序计算。我很确定我的版本应该可以工作......
    【解决方案2】:

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

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

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

    【讨论】:

    • 我尝试将 .Distinct() 移动到示例中的位置,它返回相同的记录数。看起来合乎逻辑,但不起作用。
    • 您期望结果是什么?身份证列表?服务对象列表?另外,尝试在Distinct() 之后添加.ToArray().ToList()。我想确定查询是否已实际执行。
    • 我希望得到一个不同 ID 的列表,但我得到的是一个包含重复 ID 的列表。
    • 添加了一个 ToList() 并且我仍然得到 dups。
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2014-07-10
    相关资源
    最近更新 更多