在linq查询中空检查

时间:2017-01-24 08:36:52

标签: c# asp.net entity-framework linq

我之前提出的问题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>时,为什么它不起作用

2 个答案:

答案 0 :(得分:0)

在第一种情况下,您的类型为IEnumerableSQL中没有任何相等的类型。但第二种情况是可以为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();