2012-04-15 122 views
1

這是我的LINQ查詢(LINQ到SQL):爲什麼我不能在linq查詢中調用函數?

pagina = (from Pagine page in kDataBase.Pagines 
      where prova(page.title_it) == urlSuddivisa[i].ToLower() 
      select page).FirstOrDefault(); 

,這就是我所說的功能(同一類中):

private string prova(string example) 
{ 
    return example; 
}    

它說:

對於方法System.String prova(System.String),不支持轉換爲sql。

我在哪裏錯了?我該如何解決它?

回答

3

由於linq查詢被轉換爲一個對你的dB運行的SQL查詢,因此無法將你的自定義函數轉換爲SQL查詢。 appraoaching問題

  • 替代方式使用存儲過程,並瞭解使用LINQ

  • 存儲過程檢索SQL內存數據,然後根據你的函數的過濾。顯然這裏的缺點是,你會從數據庫中比什麼是需要

    var paginas=(from Pagine page in kDataBase.Pagines).ToList().Where(p =>prova(p.title_it) == urlSuddivisa[i].ToLower()).FirstOrDefault();

    是你想要的東西來獲取大量的很多的行數。

在一個側面說明,我猜你的方法prova並不僅僅是返回字符串更加否則功能是完全沒用的,你可能也擺脫功能。另外,我相信你正在向數組的數據庫cos發出多個查詢,並使用計數器i,您可以始終使用IN查詢並避開它,請記住IN查詢中元素數量的限制。

1

隨着linq to sqlExpression tree得到解析爲SQL查詢,而不是像運行它像linq to objects

您的ORM提供程序不知道如何將該方法轉換爲SQL。

您不應該使用linq to SQLLINQ查詢中的方法。

3

您的linq查詢表達式在運行時被轉換爲sql,並且框架不知道如何將prova方法調用轉換爲適當的sql。相反,你可以這樣做:

pagina = (from Pagine page in kDataBase.Pagines select page).ToList().Where(p => prova(p.title_it) == urlSuddivisa[i].ToLower()).FirstOrDefault(); 

這將通過toList將頁面拖入內存,然後可以評估prova方法。

相關問題