System.NotSupportedException - 无法比较'System.Linq.IQueryable类型的元素

时间:2017-01-24 07:05:58

标签: c# .net entity-framework linq

我目前收到以下错误

  

> EntityFramework.SqlServer.dll中发生了'System.NotSupportedException'类型的异常,但未在用户代码中处理

     

其他信息:无法比较'System.Linq.IQueryable`1 [[System.Int32,mscorlib,Version = 4.0.0.0,> Culture = neutral,PublicKeyToken = b77a5c561934e089]]'类型的元素。仅支持原始类型,>枚举类型和实体类型。

我的代码是

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 == null || officeIDs.Contains(userOffice.OfficeID)) &&
                    string.Equals(userRole.RoleID, roleID) &&
                    (user.FirstName + user.LastName).Contains(query)
            select user).ToList();
}

问题似乎是从行

抛出的

(officeIDs == null || officeIDs.Contains(userOffice.OfficeID))

如果删除第一个条件officeIDs == null,查询将完美执行。

任何人都可以解释我所缺少的内容或者为什么会抛出此错误。

2 个答案:

答案 0 :(得分:9)

officeIDs == null无法转换为sql语句 改变以下内容:

(officeIDs == null || officeIDs.Contains(userOffice.OfficeID))

首先检查函数顶部是否为空:

officeIDs = officeIDs ?? Enumerable.Empty<int>;

替换该查询:

(!officeIDs.Any() || officeIDs.Any(id => id == userOffice.OfficeID))

答案 1 :(得分:2)

officeIDs == null是一个不应该是linq的一部分的语句,因为它不能映射到数据库查询(不是查询)。

确保officeID不为null,并将其从linq查询中删除。

public List<User> GetActiveUsers(IEnumerable<int> officeIDs, string roleID, string query)
    {
        officeIDs = officeIDs ?? new List<int>();

        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.OfficeID) &&
                        string.Equals(userRole.RoleID, roleID) &&
                        (user.FirstName + user.LastName).Contains(query)
                select user).ToList();
    }