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 JOIN的Nullable<int>和int?
当我必须在可空字段上进行连接时,这就是我所做的
原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,将解决你的问题.
| 归档时间: |
|
| 查看次数: |
10373 次 |
| 最近记录: |