我想从表格中选择项目,这些项目具有关系属性,如果它们可以为空(如左连接),我可以投影它们吗?如果不是我怎么解决这个问题?
class MyProducer
{
....
}
Model model = new Model();
var q =
model.Products
.Select(
p =>
new
{
id = p.Id,
producer = p.Producer != null ? new MyProducer { id = p.Producer.Id } : null
});
var r = q.ToArray();
当我执行此代码时,我有异常
无法创建“MyProducer”类型的空常量值。只要 支持实体类型,枚举类型或基元类型 这个背景。
答案 0 :(得分:1)
为什么不使用左连接?
using(var model = new Model())
{
var q =
from product in model.Products
join producer in model.Producers.DefaultIfEmpty()
on product.ProducerId equals producer.Id
select new
{
Id = product.Id,
Producer = producer != null ? new MyProducer{ Id = producer.Id} : null
}
}
答案 1 :(得分:0)
您需要将null
转换为Struct
:
Model model = new Model();
var q = model.Products.Select(p => new { id = p.Id, producer =
p.Producer != null ? new Struct { id = p.Producer.Id } : (Struct)null });
答案 2 :(得分:0)
不确定这是否是处理可能为空关系的投影的唯一方法,但这是我过去的做法。您创建新对象,然后在设置属性时适当地检查null。此解决方案的唯一问题是,您现在必须检查' id'生产者的财产'是' 0' 0知道这种关系是否为空。如果有更好的方法来处理这个,我会喜欢它,如果有人会在这里发布。
var q =
model.Products
.Select(p => new
{
id = p.Id,
producer = new MyProducer
{
id = p.Producer == null ? 0 : p.Producer.Id
}
}
);
var r = q.ToArray();