2012-02-17 73 views
1

這LINQ正常工作:選擇類(變量),而不是選擇新類{變量= X} Linq中

 return (from page in db.WebPages 
       where pageids.Contains(page.page_id) 
       select new Result 
       { 
        a = page.a, 
        b = page.b 
       }); 

不過,我願做這樣的事情不工作:

return (from page in db.WebPages select GetResult(page)); 


    public Result GetResult(WebPage page) 
    { 
     return new Result 
       { 
        a = page.a, 
        b = page.b 
       }; 

    } 

這給Linq提供了一個沒有支持轉換的錯誤。

我想這樣做的原因是因爲結果更復雜,並且代碼執行了很多次,因此避免在每個linq select new {}子句中編寫相同的內容。

+0

LINQ-to? SQL,實體...? – Jay 2012-02-17 17:10:13

+0

您正在使用哪個Linq提供程序?這顯然不是對象。 Linq到SQL,實體框架... – CodesInChaos 2012-02-17 17:10:56

+0

是linq到sql – 2012-02-17 17:13:38

回答

1

嘗試類似如下:

private static IQueryable<Result> toResults(IQueryable<WebPage> query) 
{ 
    return query.Select(item => new Result 
    { 
    //... 
    } 
} 

用法:

return toResults(db.WebPages); 

組織他們喜歡這工作對我來說與其他查詢提供的,雖然我沒有工作與Linq到SQL個人。

+0

您可以舉一個如何使用這個功能的例子。我沒有完全理解 – 2012-02-17 17:37:04

+0

更新了一個簡單的用法。您可以將它作爲實例化或靜態的,具體取決於您要放置的位置。如果你想要的話,你也可以制定一個擴展方法(不知道你希望它有多廣泛的使用)。 – Servy 2012-02-17 17:44:25

+0

工程就像一個魅力。謝謝 :) – 2012-02-17 18:11:35

1

您正試圖在數據庫範圍內執行方法GetResult()。 Linq to Sql/Entities被轉換爲SQL查詢,您的方法將無法工作。你將不得不去的辦法。或者你可以強制使用AsEnumerable()您的查詢的LINQ到對象的後期執行:

return (from page in db.WebPages 
     where pageids.Contains(page.page_id)).AsEnumerable() 
     .Select(GetResult); 
+0

是的,但是在方法A中,select new子句中有大約20行,整個linq語句重複了很多次。所以當我想在選擇新條款中改變某些東西時,我必須每隔一段時間做一些不合邏輯的事情。必須有一種方法將函數傳遞給返回適當對象的select。 – 2012-02-17 17:15:23

+1

@MarwanRoushdy:使用'AsEnumerable()'添加了一個替代方案 - 這有一個缺點,即您正在實現所有列值,但請注意這一點。 – BrokenGlass 2012-02-17 17:16:27

+0

我不能使用linq來對象,因爲我需要它到sql。該函數內的代碼確實轉換爲SQL,因爲它已在選項A – 2012-02-17 17:37:35

1

試試這個?

return db.WebPages.Where(x=> x.Contains(page.page_id).Select(x => GetResult(x));

+0

同樣的問題方法'TagThis.Models.Result GetResult(TagThis.Models.WebPage)'沒有支持轉換到SQL。 – 2012-02-17 17:42:21