Построение запросов по шагам приводит к дублированию даже при использовании Distinct ()

1

У меня есть запрос, который я пытаюсь выполнить в шагах, в зависимости от других значений. Основной запрос:

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 или чем-то, но он работает...

Питер

Теги:
linq
entity-framework-5

1 ответ

0

Задача решена. Сущность Employee фактически указывает на представление, и я не понимаю, как было построено представление. Дубликаты должны быть там, я просто должен был добавить еще один столбец в предложение where.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню