gpt4 book ai didi

c# - LINQ to Entities 对具有嵌套对象的 Union 的空引用

转载 作者:行者123 更新时间:2023-11-30 12:57:22 25 4
gpt4 key购买 nike

给定以下类结构:

public class User  // DB model
{
public Guid Id { get; set; }
public Address Address { get; set; }
// And other propeties
}

public class Invitation // DB model
{
public Guid Id { get; set; }
// And other propeties
}

public class Address // DB model
{
public string Zip { get; set; }
// And other properties
}

public class ResponseModel
{
public Guid Id { get; set; }
public ResponseAddress Address { get; set; }
}

public class ResponseAddress
{
public string Zip { get; set; }
// And other properties
}

以及以下分别返回用户和邀请的查询,目的是获得两个查询的联合:​​

var users = db.Users.Select(x => new ResponseModel() 
{
Id = x.Id,
Address = new ResponseAddress()
{
Zip = x.Address.Zip
}
});
var invitations = db.Invitations.Select(x => new ResponseModel()
{
Id = x.Id,
Address = new ResponseAddress()
{
Zip = String.Empty
}
});
var union = users.Union(invitations).ToList();

当我尝试在 DB 端执行联合操作时,我在 System.Data.Entity.CoreQuery.PlanCompiler 的深处得到了一个空引用异常。如果我分别对每个部分调用 ToList(),它就可以工作;如果我在每个部分上调用 ToList() 然后将它们结合起来,它就会起作用。

users.ToList();
invitations.ToList();
users.ToList().Union(invitations.ToList());

看起来,如果我在创建 ResponseAddress 部分之前将它们合并,然后在稍后调用 Select 时创建 ResponseAddress 部分,它会起作用:

var users = db.Users.Select(x => new  
{
Id = x.Id,
Zip = x.Address.Zip
});
var invitations = db.Invitations.Select(x => new
{
Id = x.Id,
Zip = String.Empty
});
var union = users.Union(invitations).Select(x=>new ResponseModel() {
Id = x.Id,
Address = new ResponseAddress() {
Zip = x.Zip
}
}).ToList();

关于为什么在第一组查询中调用 Union 会返回空引用异常,而在最后一个查询中调用却不会?有什么想法吗?两者都在数据库端执行,并且都应该产生相似的查询(理论上几乎相同,除了 LINQ 查询嵌套的方式。)

最佳答案

在 ResponseAddress 部分,您创建了 ResponseAddress 类的一个新实例。这对关系数据库没有意义。当您将查询结果转换为列表时,运行时的工作就是处理联合,它知道对象,而数据库服务器不知道 ResponseAddress,因为这不是它表示数据的方式。

关于c# - LINQ to Entities 对具有嵌套对象的 Union 的空引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com