可枚举,空< T>(),可查询();此方法支持LINQ to Entities基础结构,不应直接从代码中使用

x33g5p2x  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(181)

我遇到运行时错误
这个方法支援LINQ to Entities基础结构,而且不适合直接从程式码使用。
说明:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误以及代码中错误来源的详细信息。
例外详细信息:系统操作无效异常:这个方法支援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;
}

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

如何从空集开始,然后在其上生成Linq-to-sql结果?

q3qa4bjr

q3qa4bjr1#

您可以重构代码以不需要空集合,方法是只合并您拥有的结果:

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));
}
kuuvgm7e

kuuvgm7e2#

我使用的临时黑客
就是从

var results = Enumerable.Empty<T>().AsQueryable();

var results = queryable.Where(o => false);
w1jd8yoj

w1jd8yoj3#

var results = queryable.Take(0);

如果结果中至少有一个并集,那么第一个空结果集将被忽略,生成的SQL查询中也不包含它。因此,如果你用这个空结果集调用Union,在生成的SQL中,根本就没有并集。但是如果你不调用并集,它仍然会调用数据库。即使存在WHERE (1=0),也是如此。在这种情况下,最好返回一个空的可枚举对象或一个列表,以避免不必要的DB调用。

相关问题