【问题标题】:Lambda Distinct not workingLambda Distinct 不工作
【发布时间】:2016-06-04 18:58:52
【问题描述】:

我无法从我的 Lambda 查询中获得不同的“订单”列表。即使我使用关键字Distinct(),它仍然返回重复的选择列表项。

public ActionResult Index()
{
        var query = _dbContext.Orders
                                    .ToList()
                                    .Select(x => new SelectListItem
                                    {
                                        Text = x.OrderID.ToString(),
                                        Value = x.ShipCity
                                    })
                                    .OrderBy(y => y.Value)
                                    .Distinct();

        ViewBag.DropDownValues = new SelectList(query, "Text", "Value");

        return View();
}

有什么建议吗?

更新

对不起,我真的错过了代码中的Distinct()。我现在已将其添加到我的代码中。

我基本上是在尝试获取所有不同的行,其中值相同但 ID 不同。

与此 SQL 查询相同......

SELECT distinct [ShipCity] FROM [northwind].[dbo].[Orders] ORDER by ShipCity

【问题讨论】:

  • 您的代码对Distinct()的调用次。
  • 还有一些使用实体框架时的一般建议(我假设 _dbContext 是 EF 上下文):调用 ToList() 应该是你做的最后一件事。 Single()、First()、Last()、Any()、Count() 等也是如此......你明白了...... EF 足够“聪明”,不会往返 DB,直到它必须.所以...如果您在进行枚举列表的调用之前执行您的 Where()、Select()、OrderBy() 等操作,您的效率将大大提高。我建议您阅读更多有关实体框架的信息。
  • 请使用 Distinct 调用发布代码。我们需要了解您尝试或正在尝试实现的目标。
  • 大家好,我已经用Distinct 调用更新了我的代码。我真的错过了它,因为我在这里发布问题之前一直在测试它。
  • 不要调用.ToList() 首先,您的查询格式应与db.table.Where().OrderBy().Select().Distinct().ToList() 类似,否则当您将 .ToList()` 作为您的第一个方法调用时,它会将整个表拉入内存

标签: c# lambda


【解决方案1】:

我假设您从查询末尾删除了 distinct。

实际上,就此而言,我根本看不出您如何获得重复订单,因为您在查询中除了选择之外什么都不做,并且您的查询位于数据库中的表上,因此您已经无法获得同一行多次。

什么叫“重复”?如果您的意思是两行具有相同的值,除了它们的 ID 根本不是重复的,那只是两个不相关的行,具有相同的值。 . .

另一方面,如果您的意思是您希望它们是平等的,因为您在选择之后折腾 .Distinct 并且您只使用 OrderId 和 ShipCity 那里有重复(我真的不看看为什么订单表中名为 OrderId 的列应该有重复项,但这是另一个问题)那么这仍然不起作用,因为您没有选择 OrderId 或 ShipCity,您正在选择一个新的 SelectListItem 并且如果您使用创建两个引用类型相同的值,它们在 .NET 中不相等,它们需要是相同的实例才能相等,而不是具有不同值的两个实例。

根据您的评论编辑:

var query = _dbContext.Orders
                                .ToList()
                                // Group them by what you want to "distint" on
                                .GroupBy(item=>item.ShipCity)
                                // For each of those groups grab the first item, we just faked a distinct)
                                .Select(item=>item.First())
                                .Select(x => new SelectListItem
                                {
                                    Text = x.OrderID.ToString(),
                                    Value = x.ShipCity
                                })
                                .OrderBy(y => y.Value)
                                .Distinct();

【讨论】:

  • 嗨,Ronan 我已经用Distinct() 更新了我的代码,并且如上所述,我已经从我的代码中删除了它。基本上我试图从数据库中获取所有不同的行,正如你提到的那样,从不同的 ID 共享相同的值。像这样的查询SELECT distinct [ShipCity] FROM [northwind].[dbo].[Orders] ORDER by ShipCity希望它更清楚?
  • @Kevin 是的,但你不能用 linq 内置,没有“DistinctBy”可以让你通过字段而不是整个对象(或数据库一侧的行)来区分某些东西)。但是,您可以使用 groupby 作弊,现在使用符合您要求的示例编辑我的答案
  • 感谢@Ronan 的解释。这解决了问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多