Enumerable.Empty <T>()AsQueryable已(); 此方法支持LINQ to Entities基础结构,不应在代码中直接使用

Mat*_*ius 8 c# linq entity-framework iqueryable linq-to-sql

我收到运行时错误

此方法支持LINQ to Entities基础结构,不应在代码中直接使用.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.InvalidOperationException:此方法支持LINQ to Entities基础结构,不应在代码中直接使用.

我试图通过在所有搜索字段上添加所有匹配记录(OR而不是AND)来生成查询而不是对每个搜索条件进行过滤.

public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class 
{
    var results = Enumerable.Empty<T>().AsQueryable();
    if (search != null)
    {
        if (search.PolicyNumber.HasValue && typeof (IPolicyNumber).IsAssignableFrom(queryable.ElementType))
        {
            results = results.Union(queryable.SearchByPolicyNumber(search));
        }

        if (search.UniqueId.HasValue && typeof (IUniqueId).IsAssignableFrom(queryable.ElementType))
        {
            results = results.Union(queryable.SearchByUniqueId(search));
        }

        if (!string.IsNullOrWhiteSpace(search.PostCode) && typeof(IPostCode).IsAssignableFrom(queryable.ElementType))
        {
            results = results.Union(queryable.SearchByPostCode(search));
        }
    }

    return results;
}
Run Code Online (Sandbox Code Playgroud)

当我介绍var results = Enumerable.Empty<T>().AsQueryable();我需要从空的东西开始时机制开始失败.

如何从空集开始,然后在顶部构建Linq-to-sql结果?

Ser*_*rvy 13

你可以通过只有你所拥有的联合结果来重构代码,而不需要一个空集:

public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class 
{
    var subQueries = new List<IQueryable<T>>();
    if (search != null)
    {
        if (search.PolicyNumber.HasValue && typeof (IPolicyNumber).IsAssignableFrom(queryable.ElementType))
        {
            subQueries.Add(queryable.SearchByPolicyNumber(search));
        }

        if (search.UniqueId.HasValue && typeof (IUniqueId).IsAssignableFrom(queryable.ElementType))
        {
            subQueries.Add(queryable.SearchByUniqueId(search));
        }

        if (!string.IsNullOrWhiteSpace(search.PostCode) && typeof(IPostCode).IsAssignableFrom(queryable.ElementType))
        {
            subQueries.Add(queryable.SearchByPostCode(search));
        }
    }

    return subQueries.DefaultIfEmpty(queryable)
        .Aggregate((a, b) => a.Union(b));
}
Run Code Online (Sandbox Code Playgroud)