2012-03-29 72 views
1

我想從表中選擇項目,這些項目有關係屬性,我可以投影他們,如果他們可以爲空(即像左連接)?如果不是我能如何解決這個問題?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」。在此上下文中僅支持 實體類型,枚舉類型或基元類型。

+0

@All:仔細看看錯誤,我懷疑它完全在其他地方。注意它說'null常量值',我看不出有什麼與常量在這裏。 – Rawling 2012-03-29 12:15:37

+0

什麼是異常類型? – jrummell 2012-03-29 15:22:13

回答

0

你需要投你nullStruct

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 }); 
+0

對不起「Struct」是類的錯誤名稱,實際上Struct是類。 – baio 2012-03-29 12:00:54

+0

然後只要刪除'?'。 – DaveShaw 2012-03-29 12:01:42

+0

仍然沒有工作,同樣的例外 – baio 2012-03-29 12:02:42

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 
    } 
} 
+0

我試圖建立像LINQ entyities和我的模型之間的映射,在左連接的情況下會是醜陋的。正如你可以看到2行原始代碼打出5行左連接。從代碼可讀性這點不愉快。 – baio 2012-03-29 12:50:02

+0

@baio,如果你想減少只在一行上放置匿名類型初始值設定項的行數'select new {Id = product.Id,Producer = producer!= null?新的MyProducer {Id = producer.Id}:null}' – RePierre 2012-03-29 13:11:30

+0

好吧我明白你的意思是說,但實際上這只是代碼的例子,真正的代碼是以特定的方式編寫的,我不想拒絕它, 如果可能。 – baio 2012-03-29 13:19:18

0

不知道這是否是處理可能爲null關係的投影的唯一方法,但這是我過去如何做的。你創建你的新對象,然後在設置屬性時適當地檢查null。這個解決方案唯一的問題是,你現在必須檢查'producer'的'id'屬性是否爲'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();