c# – LINQ to Entities对带有嵌套对象的Union的null引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – LINQ to Entities对带有嵌套对象的Union的null引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1944字,纯文字阅读大概需要3分钟。
内容图文
给定以下类结构:
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();
当我尝试使用union DB-side时,我在System.Data.Entity.CoreQuery.PlanCompiler中深入获得了一个null引用异常.如果我单独调用每个部件上的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查询嵌套的方式.)
解决方法:
在ResponseAddress部分中,您将创建一个ResponseAddress类的新实例.这对关系数据库没有意义.当您将查询结果转换为列表时,它是运行时处理联合的工作,它知道对象,而数据库服务器不知道ResponseAddress,因为它不是它如何表示数据.
内容总结
以上是互联网集市为您收集整理的c# – LINQ to Entities对带有嵌套对象的Union的null引用全部内容,希望文章能够帮你解决c# – LINQ to Entities对带有嵌套对象的Union的null引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。