Lambda Distinct无法正常工作

时间:2016-06-04 18:58:52

标签: c# lambda

我无法从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

1 个答案:

答案 0 :(得分:1)

我假设你从查询的末尾删除了你的异类。

实际上就此而言,我看不出你怎么能得到重复的订单,因为你在查询中什么都不做,除了选择你的查询是在数据库的一个表上,所以你已经无法得到同一行多次。

你称之为“重复”是什么?如果你的意思是两行具有相同的值,除了它们的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();