我有以下代码,它返回一个不支持的异常。现在我不确定为什么。
所有四个子查询(变量creator,companies,companyUser和locationUsers)都返回一个数据库对象,我只在子查询后调用ToList()。
错误发生在代码的最后一行,并说:
Unable to create a constant value of type 'Data.CRM_UserLocatie'
导致此错误的原因是什么?如何解决?
var creator = Db.UserTable.Include(u => u.UserDataTable).SingleOrDefault(u => u.UserPk == userId);
if (creator == null)
return null;
var companies= Db.CompanyTable.Where(w => creator.UserLocation.Any(a => a.LocationTable.CompanyId== w.CompanyId|| a.LocationTable.CompanyTable.ParentId == w.CompanyId)).Select(s => s.CompanyId);
var companyUsers = (from u in Db.UserLocation
join l in Db.LocationTable on u.LocationId equals l.LocationId
where companies.Contains(l.CompanyId?? 0)
select u.UserId);
var locationUsers = (from l in Db.LocationTable
join ul in Db.UserLocationon l.LocationId equals ul.LocatieId
join u in Db.UserTable on ul.UserId equals u.UserId
where companies.Contains(l.companyId?? 0)
select u.UserId);
var totalUsers = companyUsers.Union(locationUsers );
var employees = Db.UserTable.Where(u => u.RoleId == participantId && u.Actief && totalUsers.Select(c => c).Contains(u.UserId));
return employees.ToList().Select(m => new User(m)).ToList();
答案 0 :(得分:0)
错误主要是因为你将linq与linq混合到了对象的实体,因此尝试将实体与内存中的对象进行比较。
当底层集合包含框架的查询构建器能够转换为SQL IN语句的常量值的基元时,Linq to entity仅接受基于Contains()方法或Enumerable.Contains()扩展的集合。 <{1}}在运行时。
在使用基于集合的contains()方法之前,您应该找到一个不需要预先加载任何数据的查询,或者将相关数据预加载到基元的列表或数组中。
也可以隐式地将Linq的片段运行到对象,并在linq to entity查询中使用结果,但是为了避免副作用,我不推荐它。