LINQ使用null投影关系属性

时间:2012-03-29 11:55:19

标签: c# linq

我想从表格中选择项目,这些项目具有关系属性,如果它们可以为空(如左连接),我可以投影它们吗?如果不是我怎么解决这个问题?

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”类型的空常量值。只要   支持实体类型,枚举类型或基元类型   这个背景。

3 个答案:

答案 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();