2012-05-07 4 views
0

У меня есть ситуация, когда я показываю список продуктов для клиента. Итак, есть два вида продуктов. Итак, если клиент зарегистрирован на два продукта, то оба продукта будут отображаться. Итак, мне нужно отобразить отдельные строки. Я сделал это:Отдельные элементы в 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 - это значение, которое я получаю из выпадающего списка. Тем не менее, он по-прежнему отображает одну и ту же строку дважды. Итак, можете ли вы сообщить мне, как я могу отображать только отдельные записи.

+0

На какое имущество вы хотите Distinct действовать на ? – Ramesh

ответ

2

Наиболее вероятными причинами могут быть то, что Distinct при вызове без параметра по умолчанию сравнивает все общедоступные свойства для равенства. Я подозреваю, что ваш идентификатор будет уникальным. Следовательно, Distinct не работает для вас.

Вы можете попробовать что-то вроде

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

Я нашел это, как ответы на

  1. How to get distinct instance from a list by Lambda or LINQ
  2. Distinct() with lambda?
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 
} 

Примечания, с помощью этого анонимного компаратор может работать лучше для вас, но он сравнивает все свойства в анонимном типе, а не только идентификатор клиента, как указано в вопрос.

+0

Может ли это быть анонимной функцией без отдельного метода @dbaseman? – dumbledad

+1

@ dumbledad нет :(. Я не знаю, как это сделать, используя анонимную функцию. Http://stackoverflow.com/q/191013/1001985 – McGarnagle

1

Посмотрите LINQ Select Distinct with Anonymous Types

Я угадывание r.ID варьируется между двумя продуктами, которые являются одинаковыми, но у вас есть такой же Products_Id?

Смежные вопросы