我有麻煩混合使用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))
isGood()函數是一個可以包含的簡單函數嗎?如果它可以表示爲Linq,那將是最簡單的解決方案。 – 2012-04-02 13:54:10
它相當複雜。除此之外,它檢查item1是否適合放在另一個表的任何item2中,允許旋轉 – HugoRune 2012-04-02 13:57:10
是的,這麼認爲。那麼我認爲沒有任何選擇。把整個名單拉回來。找到主鍵,然後在完成提交時進行刪除。我很想知道是否有其他人可以想辦法解決這個問題,所以我很喜歡它,看看有沒有人能想出辦法。 – 2012-04-02 14:02:55