【问题标题】:Left Outer Join Entity Framework getting error Unable to create a null constant左外连接实体框架出现错误无法创建空常量
【发布时间】:2014-01-28 17:33:11
【问题描述】:

我正在尝试执行左外连接。它似乎工作正常,但是当我的 Friends 表为空时我遇到了问题。

例如,Users 表具有与 Table Friends (id) 列相关的外键 (friendId)。

有时虽然我的用户不会与朋友链接,但我收到此错误: 无法创建类型为“PandaBrew.Models.FriendModel”的空常量值

我该如何处理?

回购代码:

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,但它不起作用。

【问题讨论】:

  • 我通常通过创建一个空的(在这种情况下)FriendModel 而不是 null 然后检查它(然后可能将 Friend 设置为 null)来解决这个问题。不是你的代码有问题,是 EF 有问题。
  • 嗯,你能告诉我你的意思吗?因为当我将它设置为空时,我仍然得到一个错误。
  • 我的意思是最简单的形式: .. Friend = u.FriendId != null ? new FriendModel() { ... } : new FriendModel(), ... 然后执行类似“if (authUser.Friend.Id == 0) authUser.Friend = null”的操作。
  • 一个新错误:类型 FriendModel 出现在单个 LINQ to Entities 查询中的两个结构不兼容的初始化中。
  • 哦,该死的,我想我混淆了我使用过的几种不同的解决方法(目前没有我的项目或视觉工作室,所以无法仔细检查)。但我认为另一种选择是对每个属性进行“u.FriendId!= null”检查。像这样: ... Friend = new FriendModel() { Alias = u.FriendId != null ? j.别名:“”,...}。如果你到那时还没有这个问题的答案,我会在明天上班时仔细检查。

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


【解决方案1】:

所以在对源代码控制和内存进行了一些挖掘之后,我回忆起我最初的评论是我尝试的第一件事,但最终没有奏效。最后,我决定只拆分查询(删除连接),然后检查是否需要第二个查询来获取相关数据。我首先将所有内容都选择为匿名类型,然后根据需要填充我的实际课程,但再次查看它,我认为在你的情况下有一种更简单的方法(见下文)。

var authData = (from u in db.Users
                where u.EmailAddress == user.EmailAddress
                select new
                {
                    Id = u.Id,
                    CreatedOn = u.CreatedOn,
                    EmailAddress = u.EmailAddress,
                    FriendId = u.FriendId,
                    RoleId = u.RoleId,
                    PasswordHash = u.PasswordHash,
                    FriendId = u.FriendId
                }).SingleOrDefault();

var authUser = new UserModel()
{
    Id = authData.Id,
    CreatedOn = authData.CreatedOn,
    EmailAddress = authData.EmailAddress,
    FriendId = authData.FriendId,
    RoleId = authData.RoleId,
    PasswordHash = authData.PasswordHash
};

if (authData.FriendId != null)
{
    // Set authUser.Friend here with a new query
}

或者更简洁的方法是只使用 ID 初始化 Friend:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多