2017-07-31 91 views
-1

我有這樣的代碼實體:C#實體框架做字節數組包含在LINQ字符串where子句

context.myTable.Where(x => x.myByteArray.Contains(myString)).Load(); 

它不工作,因爲字節數組沒有「包含」的定義。所以,我想要做這樣的事情:

context.myTable.Where(x => Encoding.Default.GetString(x.myByteArray).Contains(myString)); 

這也並沒有因爲異常的工作:

LINQ到實體無法識別方法「System.String的GetString(字節[]) '方法,並且此方法不能轉換爲商店表達式。

我怎樣才能在我的字節數組中搜索字符串,然後使用Linq-to-Entities?

+0

我不確定你真的可以做到這一點。您可以嘗試將myByteArray放入列表中:x.myByteArray.ToList()。Contains(myString)。但是風險在於你將加載所有數據庫......無論如何你無法比較這兩個字符串,因爲字節不是字符串...... – JBO

+0

'SqlFunctions.CharIndex'。 –

+1

您應該有實際支持文本的不同SQL列類型(如'varchar(max)')。嘗試構建一個與你試圖用EF做什麼相當的SQL查詢...如果你不能這樣做,那麼EF可能也會失敗。 – grek40

回答

0

讓我試着解釋爲什麼發生在你身上。 在where函數中,你輸入了linq,它沒有你可能需要的所有可用的C#函數。什麼你寫有查詢,作爲this

陳述如下什麼你可能會尋找:

String myString = "someValue"; 
byte[] myByteArray= Encoding.ASCII.GetBytes(myString); 
var myEntity = context.myTable.Where(x => Arrays.equals(x.StringValue, myByteArray)); 

這裏做的事情是:

  • 它創建的字符串

  • 它的字符串轉換成字節數組

  • 它檢查myByteArray的值是否與實體對象的字節數組相同,並用包含字節數組的實體填充「myEntity」。如果找到多個匹配實體,則該變量將變爲您實體類型的List<T>

這可能會解決您的問題。

+0

您無法將'byte []'與'=='進行比較。即使可以,這與Contains()不一樣。 –

+0

基於==語句編輯答案。 @HenkHolterman我認爲他想要做的是比較兩者,而不是看看字符串是否包含其他字符。在他自己提供的代碼中,這是一個錯誤。至少,這就是他的問題聽起來像。 – Bryan