[英]Null check in linq query
我之前詢問過的一個問題System.NotSupportedException-無法比較類型'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>
時不起作用
在第一種情況下,您的類型是IEnumerable
,在SQL
中沒有任何相等值。 但是第二種情況是一個可空的int
,表示SQL
具有確切的類型:
具有
int
數據類型的列,並選中允許空值。
因此, officeID == null
可以通過實體框架在SQL
端轉換為表達式,但是IEnumerable
不是SQL
可以識別的類型,另一方面,它的值是內存中的引用。 您想如何在SQL
中檢查應用程序內存中的指向位置沒有指向空對象。
對於集合,請改用Contains(),如果用戶的officeID在您的集合中,它將返回Users。
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();
}
然后,您可以將其與null檢查結合使用,並根據結果執行不同的查詢:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.