通过Entity Framework Core中的导航属性(字符串过滤器)进行过滤

时间:2017-10-03 16:30:54

标签: c# .net entity-framework entity-framework-core

我正在使用实体框架核心,我在使用导航属性的查询时遇到问题。 Product是实体,Provider是相关实体。

这个例子很容易理解。

var query = _context.Products
                .Include(p => p.Provider)
                .Where(p => ValidationExtensions.ValidatesFilter("something", p.Name));

其中ValidatesFilter是扩展方法:

internal static class ValidationExtensions
{
    public static bool ValidatesFilter(this string str, string referenceStr)
    {
        if (str == null)
        {
            return true;
        }

        if (referenceStr == null)
        {
            return false;
        }

        return string.IsNullOrEmpty(str) || ValidateStr(str, referenceStr);
    }

    private static bool ValidateStr(string str, string referenceStr)
    {
        if (str.StartsWith("*"))
        {
            return referenceStr.EndsWith(AsString(str.Skip(1)), StringComparison.OrdinalIgnoreCase);
        }

        if (str.EndsWith("*"))
        {
            return referenceStr.StartsWith(AsString(str.TakeWhile(c => c != '*')), StringComparison.OrdinalIgnoreCase);
        }

        if (str.Contains('*'))
        {
            bool containsAllChunks;
            var chunksToCheck = str.Split(new[] { "*" }, StringSplitOptions.RemoveEmptyEntries);
            containsAllChunks = chunksToCheck.All(s => referenceStr.Contains(s, StringComparison.OrdinalIgnoreCase));
            return containsAllChunks;
        }

        return string.Equals(str, referenceStr, StringComparison.OrdinalIgnoreCase);
    }

    private static string AsString(this IEnumerable<char> characters)
    {
        return string.Concat(characters);
    }
}

我正在尝试使用导航属性进行过滤,因此我使用的是Include,但在运行代码时,p.Providernull,因此失败。似乎Include未加载导航属性。

那怎么办呢?非常感谢提前!

0 个答案:

没有答案