1

我有一种情况,我为客户显示产品列表。所以,有两种产品。因此,如果客户注册了两种产品,那么这两种产品都会显示。所以,我需要显示不同的行。我这样做了:

   var queryProducts = DbContext.CustomerProducts.Where(p => p.Customers_Id ==  
                                            customerID).ToList().Select(r => new
                           {
                               r.Id,
                               r.Products_Id,
                               ProductName = r.Product.Name,
                               ShortName = r.Product.ShortName,
                               Description = r.Product.Description,
                               IsActive = r.Product.IsActive

                           }).Distinct();

在此,customerID 是我从下拉列表中获得的值。但是,它仍然显示同一行两次。那么,你能告诉我如何只显示不同的记录吗?

4

3 回答 3

3

最可能的原因可能是默认情况下不带参数调用 Distinct 时会比较所有公共属性是否相等。我怀疑您的 ID 将是唯一的。因此 Distinct 不适合你。

你可以尝试类似的东西

myCustomerList.GroupBy(product => product.Products_Id).Select(grp => grp.First());

我发现这是答案

  1. 如何通过 Lambda 或 LINQ 从列表中获取不同的实例
  2. 与 lambda 不同()?
于 2012-05-07T03:51:59.757 回答
1

您可以编写IEqualityComparer<CustomerProduct>的实现。一旦你有了它,那么你可以使用它:

DbContext.CustomerProducts.Where(p => p.Customers_Id == customerId)
    .ToList()
    .Distinct(new MyComparer())
    .Select(r => new {
    // etc.

public class MyComparer : IEqualityComparer<CustomerProduct>
{
    // implement **Equals** and **GetHashCode** here
}

请注意,使用此匿名比较器可能更适合您,但它会比较匿名类型中的所有属性,而不仅仅是问题中指定的客户 ID。

于 2012-05-07T03:48:25.370 回答
1

看看LINQ Select Distinct with Anonymous Types

我猜 r.ID 在两个相同的产品之间是不同的,但是你有相同的 Products_Id?

于 2012-05-07T03:48:33.433 回答