C# 左外部联接实体框架获取错误无法创建空常量
我正在尝试执行左外连接。它似乎工作正常,但当我的Friends表为空时,我遇到了一个问题 例如,Users表具有与表Friends(id)列相关的外键(friendId) 有时,虽然我的用户不会与朋友链接,但我会出现以下错误: 无法创建“PandaBrew.Models.FriendModel”类型的空常量值 我该怎么处理呢 回购代码:C# 左外部联接实体框架获取错误无法创建空常量,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在尝试执行左外连接。它似乎工作正常,但当我的Friends表为空时,我遇到了一个问题 例如,Users表具有与表Friends(id)列相关的外键(friendId) 有时,虽然我的用户不会与朋友链接,但我会出现以下错误: 无法创建“PandaBrew.Models.FriendModel”类型的空常量值 我该怎么处理呢 回购代码: var authUser = (from u in db.Users join f in db.Friends
var authUser = (from u in db.Users
join f in db.Friends on u.FriendId equals f.Id into jointable
from j in jointable.DefaultIfEmpty()
where u.EmailAddress == user.EmailAddress
select new UserModel
{
Id = u.Id,
CreatedOn = u.CreatedOn,
EmailAddress = u.EmailAddress,
FriendId = u.FriendId,
RoleId = u.RoleId,
PasswordHash = u.PasswordHash,
Friend = u.FriendId != null ? new FriendModel()
{
Alias = j.Alias,
CarrierId = j.Id,
CreatedOn = j.CreatedOn,
FirstName = j.FirstName,
Id = j.Id,
LastName = j.LastName,
Locked = j.Locked,
PhoneNumber = j.PhoneNumber,
SteamId = j.SteamId,
} : null,
}).SingleOrDefault();
当没有friendId时,我尝试将Friend设置为null,但它不起作用。因此,在深入研究源代码管理和内存后,我回忆起,我最初的评论是我尝试的第一件没有起作用的事情。最后,我决定只拆分查询(删除连接),然后检查是否需要第二个查询来获取相关数据。首先,我将所有内容都选择为匿名类型,然后根据需要填充实际的类,但再次查看,我认为在您的情况下,有一种更简单的方法(见下文) 或者,一种更简洁的方法应该是仅使用ID初始化朋友:
var authUser = (from u in db.Users
where u.EmailAddress == user.EmailAddress
select new UserModel
{
Id = u.Id,
CreatedOn = u.CreatedOn,
EmailAddress = u.EmailAddress,
FriendId = u.FriendId,
RoleId = u.RoleId,
PasswordHash = u.PasswordHash,
Friend = new FriendModel()
{
Id = u.FriendId ?? 0
},
}).SingleOrDefault();
if (authUser.Friend.Id > 0)
{
// Set authUser.Friend here with a new query
}
我通常通过创建一个空的(在本例中是空的)FriendModel来解决这个问题,而不是null,然后检查它(之后可能会将Friend设置为null)。这不是你的代码的问题,这是EF的问题。嗯,你能告诉我你的意思吗?因为当我把它设为空的时候,我仍然会得到一个错误。以最简单的形式,我的意思是:。。Friend=u.FriendId!=无效的新建FriendModel(){…}:新建FriendModel()。。。然后执行类似“if(authUser.Friend.Id==0)authUser.Friend=null”的操作。我发现了一个新错误:在一个LINQ to Entities查询中,两个结构不兼容的初始化中出现了类型FriendModel。噢,该死,我想我混淆了我使用的两个不同的解决方法(目前没有我的项目或visual studio可用,因此无法再次检查)。但我认为另一种选择是对每个属性执行“u.FriendId!=null”-检查。例如:…Friend=new FriendModel(){Alias=u.FriendId!=null?j.Alias:,…}1.如果到明天上班时你还没有这个问题的答案,我会再查一遍。
var authUser = (from u in db.Users
where u.EmailAddress == user.EmailAddress
select new UserModel
{
Id = u.Id,
CreatedOn = u.CreatedOn,
EmailAddress = u.EmailAddress,
FriendId = u.FriendId,
RoleId = u.RoleId,
PasswordHash = u.PasswordHash,
Friend = new FriendModel()
{
Id = u.FriendId ?? 0
},
}).SingleOrDefault();
if (authUser.Friend.Id > 0)
{
// Set authUser.Friend here with a new query
}