我需要检查我的字节数组是否包含LinQ Where()
方法中的字符串。
目前我有类似的东西:
public static bool ContainsSequence(byte[] toSearch, byte[] toFind)
{
for (var i = 0; i + toFind.Length < toSearch.Length; i++)
{
var allSame = true;
for (var j = 0; j < toFind.Length; j++)
{
if (toSearch[i + j] != toFind[j])
{
allSame = false;
break;
}
}
if (allSame)
{
return true;
}
}
return false;
}
var data = MyCollection.Where(x => ContainsSequence(x.ByteArrayValue, myStringToByteArray);
但我得到例外:
LINQ to Entities无法识别ContainsSequence方法
我已经在某个地方读过我可以将ContainsSequence
方法重写为Linq.Extensions.Extension
,但我不知道怎么做。
有人可以指导我找到解决方案吗?
答案 0 :(得分:3)
EntityFramework只允许您使用有限的LINQ方法选择,因为除非您明确告诉它,否则EF不会在内存中执行它们,而是将它们转换为查询并让SQL提供程序执行此操作。如果您想使用自己的自定义方法,则必须执行以下操作:
var data = MyCollection.AsEnumerable().Where(x => ContainsSequence(x.ByteArrayValue, myStringToByteArray);
我们在这里做的是我们将集合(应该是DbSet
或IQueryable
)投射到IEnumerable
,我们可以使用自定义方法。
但请注意,这会产生将整个装置加载到内存中的副作用。除非您处理大量数据,否则这不应成为问题,但需要牢记这一点。
您可以详细了解AsEnumerable()
及其确切内容以及何时使用here。
答案 1 :(得分:0)
试试这个:
foreach (var item in MyCollection.ToArray())
{
var data = item.Where(x => x.ContainsSequence(x.ByteArrayValue, myStringToByteArray));
}