2017-07-31 88 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