2012-04-02 70 views
1

我有麻煩混合使用C#的功能與LINQ到SQL混合使用C#功能

假設我有一個數據庫表中的「東西」的條件和本地C#功能:BOOL isGood( params)

我想使用該函數從表中選擇行。

var bad = dataContext.Things.Where(t=>t.type=mytype && !isGood(t,myparams)) 
dataContect.Things.deleteAllOnSubmit(bad); 

if (dataContext.Things.Any(t=>t.type=mytype && isGood(t,myparams))) 
{ 
    return false; 
} 

當然,這並不工作,LINQ的沒有我的翻譯功能到SQL語句的方式。所以這將產生:

NotSupportedException:方法'布爾isGood(thing,params)'沒有支持轉換爲SQL。

什麼是重新設計這個工作的最好方法?

我可以拆分的聲明,並轉換爲列出這樣的:

List<Things> mythings dataContext.Things.Where(t=>t.type=mytype).toList() 
if (mythings.Any(t=>isGood(t,myparams))) 
{ 
    return false; 
} 

這個工作,但似乎效率不高,因爲整個名單在每一種情況下產生。 而我不認爲我可以做一個deleteAllOnSubmit結果

我可以做一個foreach over mythings而不是調用toList(),也可以。雖然似乎不雅。

我有什麼其他的選擇,以及這裏推薦的方法是什麼?

編輯:

調用asEnumerable()似乎是另一種選擇,而且似乎比toList()至少要好。即

dataContext.Things.Where(t=>t.type=mytype).asEnumerable().Any(t=>isGood(t,myparams)) 
+0

isGood()函數是一個可以包含的簡單函數嗎?如果它可以表示爲Linq,那將是最簡單的解決方案。 – 2012-04-02 13:54:10

+0

它相當複雜。除此之外,它檢查item1是否適合放在另一個表的任何item2中,允許旋轉 – HugoRune 2012-04-02 13:57:10

+0

是的,這麼認爲。那麼我認爲沒有任何選擇。把整個名單拉回來。找到主鍵,然後在完成提交時進行刪除。我很想知道是否有其他人可以想辦法解決這個問題,所以我很喜歡它,看看有沒有人能想出辦法。 – 2012-04-02 14:02:55

回答

2

拉動整個列表從數據庫恢復到運行本地的C#功能上它似乎效率不高,但你必須做什麼,如果你isGood()函數是本地的。

如果你可以轉換isGood()函數爲LINQ的,你可以在toList()調用之前使用它,所以它會得到翻譯成SQL和整個列表將不會被檢索。