我有一个查询,我试图按步骤构建,具体取决于其他值。主要查询是:
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有问题,但它有效...
彼得
答案 0 :(得分:0)
问题解决了。 Employee实体实际上指向一个视图,我不明白视图是如何构建的。副本应该在那里,我只需要在where子句中再添加一列。