2013-07-27 33 views
2

,其中包含有與外鍵的兩個實體的數據庫的模式,比如聯方法支持轉換爲SQL

class Item 
{ 
    public int ID; 
    public string Name; 
    public int StatusID; 
} 

class Status 
{ 
    public int ID; 
    public string Name; 
} 

有我自己的類

class MyClassFormat 
{ 
    public int ID; 
    public string Name; 
    public string Status; 
} 

現在我想創建一個方法,返回它自己的類,類似那樣

MyClassFormat getTtem(this Item item) 
{ 
    return new MyClassFormat{ID = item.ID, Name = item.Name, Status = item.Statuses.Name} 
} 

的問題是,當我用這個方法,我得到我的方法沒有支持轉換爲SQL

是否有可能創造這樣這將是代替解開其內容的方法異常調用這個方法?

解決:兩個答案都適用於解決我的問題,但第二個是一個我一直在尋找,謝謝你們

回答

0

如果你的目標是編寫代碼的多個查詢重用,你可以分析出這樣的表達式:

static Expression<Func<Item, MyClassFormat>> ItemToClassFormat() 
{ 
    return item => new MyClassFormat 
     { 
      ID = item.ID, 
      Name = item.Name, 
      Status = item.Statuses.Name 
     } 
} 

這可以用於類似:

IQueryable<Item> query = ...; 
var selector = ItemToClassFormat(); 
var results = query.Select(selector).ToList(); 
+0

我認爲,OP使用實體框架(請參閱錯誤消息)。所以,這也應該失敗,因爲LINQ to實體僅支持實體類型,複雜類型和基本類型。我錯過了什麼嗎? – Dennis

+0

@Dennis它應該工作。 EF允許您投射到非實體類(例如DTO)中。 – jeroenh

2

或者:

query 
    .Select(item => new 
    { 
     ID = item.ID, 
     Name = item.Name, 
     Status = item.Statuses.Name 
    }) 
    .ToArray() 
    .Select(item => new MyClassFormat 
    { 
     ID = item.ID, 
     Name = item.Name, 
     Status = item.Status 
    }); 

或:

query 
    .ToArray() 
    .Select(item => getTtem(item)); 

第一種方法寫入時間較長,但從數據庫載入較少的數據。 無論如何,您需要實現查詢結果(樣本中的ToArray方法)。

相關問題