我收到运行时错误
此方法支持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结果?
答案 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);