我之前提出的问题System.NotSupportedException - Cannot compare elements of type 'System.Linq.IQueryable
回答了https://stackoverflow.com/a/41822351/2004251
上述问题中的方法是从以下
修改的public List<User> GetActiveUsers(int? officeID, string roleID, string query)
{
return (from user in GetDBContext.User
join userRole in GetDBContext.UserRole
on user.UserID equals userRole.UserID
join userOffice in GetDBContext.UserAuthorizedOffice
on user.UserID equals userOffice.UserID
where user.IsActive == true &&
user.UserTypeID == 1 &&
userOffice.IsAuthorized &&
userOffice.Office.IsActive &&
(userOffice.OfficeID == officeID || officeID == null) &&
string.Equals(userRole.RoleID, roleID) &&
(user.FirstName + user.LastName).Contains(query)
select user).ToList();
}
此方法按预期工作。
我的问题:如果null
检查在此方法中有效,那么当输入参数转换为IEnumerable<int>
时,为什么它不起作用
答案 0 :(得分:0)
在第一种情况下,您的类型为IEnumerable
,SQL
中没有任何相等的类型。但第二种情况是可以为int
的{{1}},SQL
具有确切的类型:
具有
int
数据类型且已选中允许空值的列。
因此,officeID == null
可以按实体框架转换为SQL
方面的表达式,但IEnumerable
不是SQL
可以识别的类型手,它的价值是记忆中的参考。您想如何检查SQL
应用程序内存中的指向位置是否指向空对象。
答案 1 :(得分:0)
对于集合,请使用Contains(),如果他们的officeID在您的集合中,则会返回用户。
public List<User> GetActiveUsers(IEnumerable<int> officeIDs, string roleID, string query)
{
return (from user in GetDBContext.User
join userRole in GetDBContext.UserRole
on user.UserID equals userRole.UserID
join userOffice in GetDBContext.UserAuthorizedOffice
on user.UserID equals userOffice.UserID
where user.IsActive == true &&
user.UserTypeID == 1 &&
userOffice.IsAuthorized &&
userOffice.Office.IsActive &&
officeIDs.Contains(userOffice.Office)
string.Equals(userRole.RoleID, roleID) &&
(user.FirstName + user.LastName).Contains(query)
select user).ToList();
}
然后,您可以将其与空检查结合使用,并根据结果执行不同的查询:
return officeIDs != null
? (from user in GetDBContext.User
join userRole in GetDBContext.UserRole
on user.UserID equals userRole.UserID
join userOffice in GetDBContext.UserAuthorizedOffice
on user.UserID equals userOffice.UserID
where user.IsActive == true &&
user.UserTypeID == 1 &&
userOffice.IsAuthorized &&
userOffice.Office.IsActive &&
officeIDs.Contains(userOffice.Office)
string.Equals(userRole.RoleID, roleID) &&
(user.FirstName + user.LastName).Contains(query)
select user).ToList();
: (from user in GetDBContext.User
join userRole in GetDBContext.UserRole
on user.UserID equals userRole.UserID
join userOffice in GetDBContext.UserAuthorizedOffice
on user.UserID equals userOffice.UserID
where user.IsActive == true &&
user.UserTypeID == 1 &&
userOffice.IsAuthorized &&
userOffice.Office.IsActive &&
string.Equals(userRole.RoleID, roleID) &&
(user.FirstName + user.LastName).Contains(query)
select user).ToList();