LINQ中的独特元素

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

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是我从下拉列表中获得的值。 但是,它仍然会显示相同的行两次。 那么,请你告诉我如何才能显示不同的记录。

最可能的原因可能是,默认情况下,在没有参数的情况下调用Distinct会比较所有公共属性的相等性。 我怀疑你的身份证会是独一无二的。 因此,Distinct不适合您。

你可以尝试类似的东西

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

我发现这是答案

  1. 如何通过Lambda或LINQ从列表中获取不同的实例
  2. 区别()与lambda?

看看LINQ选择与匿名类型的区别

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

您可以编写IEqualityComparer 的实现 。 一旦你有了,那么你可以使用这个:

 DbContext.CustomerProducts.Where(p => p.Customers_Id == customerId) .ToList() .Distinct(new MyComparer()) .Select(r => new { // etc. public class MyComparer : IEqualityComparer { // implement **Equals** and **GetHashCode** here } 

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