即使使用Distinct(),在步骤中构建查询也会导致重复

时间:2014-05-27 17:14:13

标签: c# linq entity-framework-5

我有一个查询,我试图按步骤构建,具体取决于其他值。主要查询是:

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的那些,但它返回两个!起初我没有使用.Distinct(),因为我认为我不需要。所以,我添加了它,但它没有帮助 - 我仍然得到列表中的每个实体中的两个(匹配新添加条件的地方。)

任何人都知道这是LINQ错误还是EF错误,或解释/解决方案是什么?

修改

关于连接查询等的所有问题都没有,并且数据源不允许重复,因此在EF或LINQ to 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有问题,但它有效...

彼得

1 个答案:

答案 0 :(得分:0)

问题解决了。 Employee实体实际上指向一个视图,我不明白视图是如何构建的。副本应该在那里,我只需要在where子句中再添加一列。