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

时间:2016-06-14 14:46:54

标签: c# entity-framework linq linq-to-sql iqueryable

我收到运行时错误

  

此方法支持LINQ to Entities基础结构,但不支持   旨在直接从您的代码中使用。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.InvalidOperationException:此方法   支持LINQ to Entities基础结构,但并非如此   直接从您的代码中使用。

我正在尝试通过在所有搜索字段上添加所有匹配记录(而不是Y-m-d H:i而不是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; } 时,机制开始失败,我需要从空的东西开始。

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

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:1)

我曾经使用的临时黑客

是从

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

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