2010-03-24 45 views
3

我正在使用Linq-to-SQL,並使用已編譯的Linq來獲得更好的性能。編譯Linq&String.Contains

我有一個INT字段的用戶表名爲「LookingFor」,它可以具有下列值:1,2,3,12,123,13,23

我寫了一個查詢來返回基於「lookingFor」列的用戶,並且我想返回包含「lookingFor」值的所有用戶(不僅是那些等於它的人)。

例如,如果user.LookingFor = 12,並且查詢參數是1,則應該選擇該用戶。

private static Func<NeDataContext, int, IQueryable<int>> 
     MainSearchQuery = CompiledQuery.Compile((NeDataContext db, int lookingFor) => 
     (from u in db.Users 
      where (lookingFor == -1 ? true : u.LookingFor.ToString().Contains(lookingFor)       
    select u.username); 

此工作對非編譯的linq但在使用編譯時引發錯誤。 如何使用編譯的Linq修復它?

我得到這個錯誤:

,可以在客戶端上進行評估

只有論據支持的String.Contains方法。

+0

什麼是您會收到錯誤? – Rik 2010-03-24 12:50:30

+0

此外,編譯的LinQ可能不如您想象的那麼有益,請參閱:http://www.codinghorror.com/blog/2010/03/compiled-or-bust.html – Rik 2010-03-24 12:54:33

回答

0

您正在對無法轉換爲SQL的查找參數執行操作。我真的很驚訝,這不工作編譯查詢。

如果可能的話,我建議你改變你的數據庫以使這個查詢更容易。創建一個表來存儲用戶的LookingFor屬性。或者,您可以將lookFor的數據類型更改爲對數據庫設計影響較小的字符串。

+0

如果我將數據類型更改爲字符串,請問此在遵守linq工作?我只是沒有看到它應該有所作爲的原因。 – RuSh 2010-03-24 14:26:15

8

我正面臨同樣的問題。我已經爲此問題設法解決了一個解決方法。除了使用

u.LookingFor.ToString().Contains(lookingFor) 

的我用

u.LookingFor.ToString().IndexOf(lookingFor) >= 0 
+1

我正在使用此解決方案,但是在大多數情況下,如果它位於字符串的開頭,您可能需要> = 0,而不是> 0。 – kad81 2012-11-21 00:16:33