C# 可枚举。空<;T>;()AsQueryable();此方法支持LINQtoEntities基础结构,不打算直接从代码中使用
我得到运行时错误 此方法支持LINQ to Entities基础架构,不支持 旨在直接从代码中使用 描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源 异常详细信息:System.InvalidOperationException:此方法 支持LINQ to Entities基础架构,不打算 直接从代码中使用 我试图通过在所有搜索字段中添加所有匹配的记录(将执行C# 可枚举。空<;T>;()AsQueryable();此方法支持LINQtoEntities基础结构,不打算直接从代码中使用,c#,entity-framework,linq,linq-to-sql,iqueryable,C#,Entity Framework,Linq,Linq To Sql,Iqueryable,我得到运行时错误 此方法支持LINQ to Entities基础架构,不支持 旨在直接从代码中使用 描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源 异常详细信息:System.InvalidOperationException:此方法 支持LINQ to Entities基础架构,不打算 直接从代码中使用 我试图通过在所有搜索字段中添加所有匹配的记录(将执行或而不是和)来生成查询,而不是对每个搜索条件进行筛选 公共静态IQue
或而不是和)来生成查询,而不是对每个搜索条件进行筛选
公共静态IQueryable ApplySearch(此IQueryable可查询,SearchModel搜索),其中T:class
{
var results=Enumerable.Empty().AsQueryable();
如果(搜索!=null)
{
if(search.PolicyNumber.HasValue&&typeof(IPolicyNumber.IsAssignableFrom(queryable.ElementType))
{
结果=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));
}
}
返回结果;
}
当我引入var results=Enumerable.Empty().AsQueryable()时,机制开始失败代码>我需要从空的东西开始
如何从一个空集开始,然后在上面构建Linq到sql结果?您可以重构代码,使其不需要空集,方法是只合并您拥有的结果:
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));
}
公共静态IQueryable ApplySearch(此IQueryable可查询,SearchModel搜索),其中T:class
{
var subquerys=新列表();
如果(搜索!=null)
{
if(search.PolicyNumber.HasValue&&typeof(IPolicyNumber.IsAssignableFrom(queryable.ElementType))
{
添加(queryable.SearchByPolicyNumber(search));
}
if(search.UniqueId.HasValue&&typeof(IUniqueId.IsAssignableFrom(queryable.ElementType))
{
subquerys.Add(queryable.SearchByUniqueId(search));
}
if(!string.IsNullOrWhiteSpace(search.PostCode)和&typeof(IPostCode).IsAssignableFrom(queryable.ElementType))
{
添加(queryable.SearchByPostCode(search));
}
}
返回子查询。DefaultIfEmpty(可查询)
.聚合((a,b)=>a.Union(b));
}
我使用的临时黑客
是从
var results = Enumerable.Empty<T>().AsQueryable();
猜测:queryable.Take(0)
可能会奏效。指出此异常发生的确切位置可能是一个好主意。@spender就在.ToList()之前。
@spender此查询将在其他地方具体化,即使问题在这里。它在哪里具体化并不重要;他做得很好,确定了问题的根源,并且只显示了这一点。@spender在将数据传递给视图之前被调用的那一个,在这一点之前,它都在表达式树中。嗨,Servy。当我看到名单被介绍时,我想:“他在想什么!名单!”?但后来我意识到你做了什么,我必须说——这太棒了……:)谢谢。@IvanStoev您可以添加一个DefaultIfEmpty
来定义行为。这将取决于规范希望它是什么,如果它是一个支持的情况。我最初怀疑它想使用queryable
作为默认值。@IvanStoev在我的例子中,我返回了returnsubquerys.Any()?聚合((a,b)=>a.Union(b)):可查询
我的表中有一个XML列,因此最终使用了Concat,因为Union试图在幕后“区分”(据我所知):“code”if(subquerys.Count>0){var finalQuery=subquerys.DefaultIfEmpty().Aggregate((resultQuery,addedQuery)=>resultQuery.Concat(addedQuery));return finalQuery;}else{return Enumerable.Empty().AsQueryable();}@AustinRhymer在这种情况下,问题的要求是专门合并编译时未知的许多查询。如果您碰巧需要对未知数量的查询执行不同的操作,那么您确实需要相应地更改解决方案。但据我所知,更改将非常昂贵,因为它针对每个记录运行。
var results = Enumerable.Empty<T>().AsQueryable();
var results = queryable.Where(o => false);