Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可枚举。空<;T>;()AsQueryable();此方法支持LINQtoEntities基础结构,不打算直接从代码中使用_C#_Entity Framework_Linq_Linq To Sql_Iqueryable - Fatal编程技术网

C# 可枚举。空<;T>;()AsQueryable();此方法支持LINQtoEntities基础结构,不打算直接从代码中使用

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

我得到运行时错误

此方法支持LINQ to Entities基础架构,不支持 旨在直接从代码中使用

描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源

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

我试图通过在所有搜索字段中添加所有匹配的记录(将执行
而不是
)来生成查询,而不是对每个搜索条件进行筛选

公共静态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);