У меня есть запрос, который я пытаюсь выполнить в шагах, в зависимости от других значений. Основной запрос:
IQueryable<Employee> query =
from emp in context.Employees
where emp.PermanentClientId == Session.PermanentClientId
orderby emp.LastName, emp.FirstName
select emp;
Затем, если значение не равно null, я пытаюсь добавить его в запрос с помощью:
if (!string.IsNullorEmpty(divId))
query = (from emp in query
where emp.DivisionId == divId
select emp).Distinct();
Запрос наполовину работает: возвращаются только те, у divId
есть правильный divId
, но он возвращает два из них! Сначала я не использовал.Distinct(), так как не думал, что мне нужно. Итак, я добавил его, но это не помогает - я все еще получаю два из каждого объекта в списке (который соответствует новому, когда условие добавлено).
Кто-нибудь знает, является ли это ошибкой LINQ или ошибкой EF, или что такое объяснение/решение?
РЕДАКТИРОВАТЬ
НЕТ ко всем вопросам о конкатенации запросов и т.д., А источник данных не позволит дублировать, поэтому в EF или LINQ для Entities происходит что-то странное. Вот код (больше HACK), который я использовал для устранения дубликатов:
Employee[] empList = query.ToArray();
IDictionary<string, Employee> retval = new Dictionary<string, Employee>();
for (int i = 0; i < empList.Length; i++)
{
Employee emp = empList[i];
if ((!string.IsNullOrEmpty(empFilter.DivisionId) &&
(emp.DivisionId != empFilter.DivisionId)))
continue;
try
{
string empKey =
emp.PermanentClientId.ToString() + '-' + emp.EmployeeId.ToString();
retval.Add(empKey, emp);
}
catch (ArgumentException)
{ }
}
return retval.Values.ToArray();
Словарь не позволит дублировать ключи, которые являются теми же столбцами, в базе данных не допускаются дубликаты. Я ненавижу делать такие вещи из-за проблемы с LINQ или чем-то, но он работает...
Питер
Задача решена. Сущность Employee фактически указывает на представление, и я не понимаю, как было построено представление. Дубликаты должны быть там, я просто должен был добавить еще один столбец в предложение where.