簡體   English   中英

在linq查詢中空檢查

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM