LINQ LEFT JOIN on Nullable <int>

Fel*_*tan 5 c# linq entity-framework join

我有两张桌子:

Project(
    ProjectID       INT,
    Name            VARCHAR(200),
    AssignedUserID  INT NULL
)
User(
    UserID      INT,
    LastName    VARCHAR(50),
    FirstName   VARCHAR(50)
)
Run Code Online (Sandbox Code Playgroud)

我正在使用Entity Framework Database-First方法.所以在我的模型中:

Class Project{
    public int ProjectID;
    public string Name;
    public Nullable<int> AssignedUserID;
}

Class User{
    public int UserID;
    public string LastName;
    public string FirstName;
}
Run Code Online (Sandbox Code Playgroud)

我想查询所有PROJECT及其分配的用户:

SELECT
    p.ProjectID,
    p.Name,
    u.LastName,
    u.FirstName
FROM Project p
LEFT JOIN Users u ON u.UserID = p.AssignedUserID
Run Code Online (Sandbox Code Playgroud)

翻译为Linq:

var projectDetails =
    from p in context.Project
    join u in context.User
        on p.AssignedUserID equals u.UserID into lj
    from x in lj.DefaultIfEmpty()
        select new {
            ProjectID = p.ProjectID,
            ProjectName = p.Name,
            UserLastName = u.LastName,
            UserFirstName = u.FirstName
        }
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误:

join子句中某个表达式的类型不正确.调用"加入"时类型推断失败.

我在int上试过两个解决方案和Linq问题中的LEFT OUTER JOIN时的int比较,但它仍然给我这些错误:

使用解决方案: (int)(p.AssignedUserID ?? default(int))

LINQ to Entities无法识别方法'Int32 ToInt32(Int32)'方法,并且此方法无法转换为存储表达式.

使用解决方案GetValueOrDefault():

LINQ to Entities无法识别方法'Int32 GetValueOrDefault(Int32)'方法,并且此方法无法转换为存储表达式.

你怎么做LEFT JOINNullable<int>int

Che*_*rra 8

当我必须在可空字段上进行连接时,这就是我所做的

原Linq:

var projectDetails =
    from p in context.Project
    join u in context.User
        on p.AssignedUserID equals u.UserID into lj
    from x in lj.DefaultIfEmpty()
        select new {
            ProjectID = p.ProjectID,
            ProjectName = p.Name,
            UserLastName = u.LastName,
            UserFirstName = u.FirstName
        }
Run Code Online (Sandbox Code Playgroud)

修改后的Linq:

var projectDetails =
    from p in context.Project
    join u in context.User
        on new {User = p.AssignedUserID} equals new {User = (int?)u.UserID} into lj
    from x in lj.DefaultIfEmpty()
        select new {
            ProjectID = p.ProjectID,
            ProjectName = p.Name,
            UserLastName = x.LastName,
            UserFirstName = x.FirstName
        }
Run Code Online (Sandbox Code Playgroud)

问题是你正在尝试使用int?来加入一个int,它会给你错误信息,将UserId的int转换为可以为null的int,将解决你的问题.