【发布时间】:2016-04-08 11:33:02
【问题描述】:
给定以下类结构:
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();
当我尝试执行联合数据库端时,我在 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 会返回空引用异常,而在最后一个查询中调用不会返回有什么想法吗?两者都在 DB 端执行,并且都应该产生相似的查询(理论上几乎相同,除了 LINQ 进行查询嵌套的方式。)
【问题讨论】:
-
您可以在
IQueryable上使用ToString()查看查询 -
另外我在您的模型中没有看到任何
virtual关键字,这是加载相关实体所必需的
标签: c# entity-framework linq