2013-03-15 3 views
0

Используя следующий код, я не получаю записи, отличные от ID. Почему это?Не возвращать отдельные записи при использовании Distinct()

List<string> products = new List<string>(); 
products.Add("13CONV"); 
products.Add("12CONV"); 
products.Add("11CONV"); 
products.Add("10CONV"); 
products.Add("09CONV"); 
products.Add("08CONV"); 
products.Add("07CONV"); 

var predicate = PredicateBuilder.True<Services>() 
           .And(m => products.Contains(m.Service)); 

var Results = from d in Services.Distinct() 
           .Where(predicate) 
       select d.ID; 

таблицы базы данных (услуги) является:

ID   Service 
== 
400  13Conv 
401  13Conv 
400  12Conv 
400  07Conv 
400  11Conv 

Используя данные выше я получаю количество 5 записей, когда я ожидал бы 2.

Поле ID является строкой в DB.

ответ

3

Это Distinct, а не DistinctByKey (такой метод не существует в LINQ), поэтому все значения в строке проверяются на равенство. При этом проверка не строк равна. Вот почему все они возвращаются по запросу.

Кстати, как могла бы база данных решить, какая строка с данными Key должна быть возвращена?

Если вы пытаетесь получить только ID с, и они должны отличаться попробовать этот запрос:

var results = Services.Where(predicate).Select(s => s.ID).Distinct().ToList(); 

Update

По вопросу, как this one есть известная проблема с LINQ к Entites и DISTINCT. Попробуйте этот запрос вместо:

Services.Where(predicate).GroupBy(s => s.Id).Select(g => g.Key).ToList(); 
+0

Не уверен, что я понимаю ваш последний вопрос. –

+2

Я думаю, что я имею в виду тот факт, что вы не предоставили информацию, чтобы предлагать (и это нельзя сделать вывод), которая была бы правильной для ID = 400 и ID = 401. Уверен, что вы не хотите, чтобы группа «вместо» была отличительной? – Rich

+0

Я бы ожидал, что он будет вести себя так же, как SQL Distinct. Мне не нужны данные служб, которые мне нужны только для уникальных идентификаторов. –

1

Вы сказали, это вы хотели отчетливый список Service объектов, а не идентификаторов услуг (или имена).

Я не знаком с построением предикаты программно, но я думаю, что вы могли бы сделать что-то вроде этого:

var Results = (from d in Services.Where(Predicate) 
       select d.ID).Distinct(); 
+0

Я пробовал перемещать .Distinct() туда, где у вас есть это в вашем примере, и он возвращает тот же счетчик записей. Кажется логичным, но не работает. –

+0

Что, по вашему мнению, есть Результаты? Список идентификаторов? Список объектов службы? Кроме того, попробуйте добавить '.ToArray()' или '.ToList()' после 'Distinct()'. Я хочу быть уверенным, что запрос действительно был выполнен. –

+0

Я бы ожидал список различных идентификаторов, и вместо этого я получаю список идентификаторов с дубликатами. –

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