C#字节数组包含linq里面的字符串

时间:2017-07-10 07:04:46

标签: c# arrays linq linq-extensions

我需要检查我的字节数组是否包含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,但我不知道怎么做。 有人可以指导我找到解决方案吗?

2 个答案:

答案 0 :(得分:3)

EntityFramework只允许您使用有限的LINQ方法选择,因为除非您明确告诉它,否则EF不会在内存中执行它们,而是将它们转换为查询并让SQL提供程序执行此操作。如果您想使用自己的自定义方法,则必须执行以下操作:

var data = MyCollection.AsEnumerable().Where(x => ContainsSequence(x.ByteArrayValue, myStringToByteArray);

我们在这里做的是我们将集合(应该是DbSetIQueryable)投射到IEnumerable,我们可以使用自定义方法。

但请注意,这会产生将整个装置加载到内存中的副作用。除非您处理大量数据,否则这不应成为问题,但需要牢记这一点。

您可以详细了解AsEnumerable()及其确切内容以及何时使用here

答案 1 :(得分:0)

试试这个:

foreach (var item in MyCollection.ToArray())
{
   var data = item.Where(x => x.ContainsSequence(x.ByteArrayValue, myStringToByteArray));
}