NotSupportedException:无法在LINQ查询中创建常量值

时间:2017-05-02 08:05:59

标签: c# entity-framework linq

我有以下代码,它返回一个不支持的异常。现在我不确定为什么。

所有四个子查询(变量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();

1 个答案:

答案 0 :(得分:0)

错误主要是因为你将linq与linq混合到了对象的实体,因此尝试将实体与内存中的对象进行比较。

当底层集合包含框架的查询构建器能够转换为SQL IN语句的常量值的基元时,Linq to entity仅接受基于Contains()方法或Enumerable.Contains()扩展的集合。 <{1}}在运行时。

在使用基于集合的contains()方法之前,您应该找到一个不需要预先加载任何数据的查询,或者将相关数据预加载到基元的列表或数组中。

也可以隐式地将Linq的片段运行到对象,并在linq to entity查询中使用结果,但是为了避免副作用,我不推荐它。