2016-08-18 75 views
1

我希望有人能helpme IM工作在C#與實體框架6如何通過多個單詞來過濾C#實體框架

我需要在我的表「產品」一個「描述」字段來搜索文本框的值,但在任何順序文本由單獨的,我可以解釋我的代碼更好:

string[] palabras = textBox1.Text.Split(' '); 
string palabraABuscar = "";      
for (int i = 0; i <= palabras.Length - 1; i++) 
{ 
palabraABuscar = palabras[i]; 
query = query.Where(a => a.DESCRIPCION.Contains(palabraABuscar)); 
} 

的想法是,如果用戶輸入「lala1 lala2」包含兩個詞程序過濾器的所有產品,例如:

程序必須顯示產品「攝像機lala2 with lala1」和「lala1 BOX lala2」 程序不得顯示「Computer lala1」或「lala2」

使用我的代碼,程序僅通過最後一個單詞(「lala」)過濾產品也許替換第一個地方,我使用了cicle因爲我不知道有多少

+0

您可能需要全文搜索,而不直接由EF支持。你將不得不採取一種解決方法,使其工作。 –

+0

IMO,您當前的代碼應該按預期工作。 –

回答

3

你currenct代碼應該按預期工作,因爲Where方法會將每個查詢添加到and。或者你可以嘗試另一種選擇(@Ghasan也評論說):

string[] palabras = textBox1.Text.Split(' '); 
query = query.Where(a => palabras.All(p => a.DESCRIPCION.Contains(p))); 

如果和你的當前代碼,也不是這對你的作品,然後檢查是否正確分割數據,並確保query是正確的,除非你達到以上代碼。此外,您可以檢查生成的SQL查詢,如:

context.Database.Log = Console.WriteLine; // Or something similar. 
+0

你的答案我可以檢查生成的SQL並確認我的代碼應該可以工作 但我仍然無法解決我的問題,我試着用我的代碼('='Project1'.'ESTADO')AND('Project1');這個sql代碼: {SELECT'Project1'.'IDPRODUCTO','Project1'.'DESCRIPCION'FROM' producto' AS' Project1' WHERE((1 ='Project1'.'ESTADO')AND('Project1' .'DESCRIPCION' LIKE @ p__linq__0))AND('Project1'.'DESCRIPCION' LIKE @ p__linq__1)ORDER BY'Project1'.'IDPRODUCTO' ASC} 我看不到錯誤:/ 我的程序仍然顯示產品就像過濾只有用戶輸入的最後一個字 –

+0

然後問題不在你的代碼中,檢查參數'p__linq__0'和'p__linq__1'並嘗試在數據庫中執行該查詢@Alexisenp –

+0

你知道爲什麼生成的sql代碼顯示我的參數,而不是價值? 以及如何查看該參數的值?:S –

1

只需更換

query = query.Where(a => a.DESCRIPCION.Contains(palabraABuscar)); 

query = query.Where(a => palabraABuscar.All(x => a.DESCRIPCION.Contains(x)); 
+0

對不起,當我使用該代碼時,我得到的錯誤(我認爲應該是palabras作爲@AdilMammadov): InnerException \t {「您的SQL語法有錯誤;請查看右邊對應於您的MariaDB服務器版本的手冊('Extent1'.'DESCRIPCION' like%s%)THEN(1)WHEN('Extent1'。'at line 16「} \t System.Exception {MySql.Data .MySqlClient.MySqlException} 我不知道爲什麼:/,我仍然試圖找出爲什麼 –

+0

看起來像一個MariaDB的bug,你可以嘗試運行'query.ToList()。Where('?如果這個工作,錯誤應該是在框架中,將linq轉換爲sql – fubo