0

我需要检查我的字节数组是否包含 LinQWhere()方法中的字符串。目前我有类似的东西:

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但我不知道如何。有人可以指导我找到解决方案吗?

4

2 回答 2

3

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

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

我们在这里所做的是将集合(应该是 aDbSetIQueryable)转换为 a IEnumerable,我们可以在其上使用自定义方法。

但是请注意,这具有将整个集合加载到内存中的副作用。除非您处理大量数据,否则这应该不是问题,但请记住这一点。

您可以在此处详细了解AsEnumerable()它的作用以及何时使用它。

于 2017-07-10T07:19:15.910 回答
0

尝试这个:

foreach (var item in MyCollection.ToArray())
{
   var data = item.Where(x => x.ContainsSequence(x.ByteArrayValue, myStringToByteArray));
}
于 2017-07-10T07:13:29.307 回答