2011-07-20 64 views
3

我要實現以下目標:的LINQ to SQL構建自定義對象外部

return (from a in db.Tags 
    select new TagItem 
    { 
     ID = a.Id, 
     Name = a.Name 
    }); 

..但我不想去實現它這樣的,因爲我需要在其他地方使用完全相同的TagItem建設(對於連接)

所以這就是意圖,來調用構造TagItem我的方法:

return (from a in db.Tags 
    select ConstructTagItem(a)); 

而且方法構造對象以相同的方式:

private TagItem ConstructTagItem(Tag a) 
{ 
    return new TagItem { ID = a.Id, Name = a.Name}; 
} 

但是這給了我以下錯誤:

Method 'TagItem ConstructTagItem(Tag)' has no supported translation to SQL.

有什麼辦法來實現這一目標?

解決方案(感謝丹尼爾Hilgarth):

return db.Tags.Select(ConstructTagItem); 

而且方法:

private Expression<Func<Tag, TagItem>> ConstructTagItem 
{ 
    get { return a => new TagItem {ID = a.Id Name = a.Name }; } 
} 

回答

3

是的,有。您需要使用表達式目錄樹是這樣的:

Expression<Func<Tag, TagItem>> constructTagItem = a => return new TagItem 
                 { ID = a.Id, 
                 Name = a.Name}; 

然後你就可以使用,而不是你的方法表達:

return db.Tags.Select(constructTagItem); 

根據this article你需要使用定義的方法鏈的方式你查詢。

+0

我剛剛想通了,我不得不使用表達式,然後你寫了這個輝煌的答案,謝謝! ..我只有一個問題,我會嘗試在我的問題中解釋它,給我一秒 – Frost

+0

@Frost:恕我直言,這應該是一個新問題,因爲它是別的。我不認爲這可以像你的第一個例子那樣完成。基本上,你只是改變了你的完整問題:)請創建一個新的問題,並接受我的答案。 –

+0

這樣做,但我寫道:「因爲我需要在別處使用完全相同的TagItem構造(對於連接)」 – Frost