Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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
Linq to sql “LINQ到SQL”;“类型”上的成员访问不合法;联合和编译查询异常_Linq To Sql_Union_Compiled Query_Linq.compiledquery - Fatal编程技术网

Linq to sql “LINQ到SQL”;“类型”上的成员访问不合法;联合和编译查询异常

Linq to sql “LINQ到SQL”;“类型”上的成员访问不合法;联合和编译查询异常,linq-to-sql,union,compiled-query,linq.compiledquery,Linq To Sql,Union,Compiled Query,Linq.compiledquery,我有多个查询,我想合并在一起,然后编译整个东西。未编译的查询运行正常,但“InvalidOperationException:成员访问'Int32 Id'的'UserQuery+Foo'在'System.Linq.IQueryable`1[UserQuery+Foo]类型上不合法”。编译并运行同一查询时会引发异常 我该如何解决这个问题 void Main() { var db = new MyDataContext( "..." ); Expression < Func

我有多个查询,我想合并在一起,然后编译整个东西。未编译的查询运行正常,但“InvalidOperationException:成员访问'Int32 Id'的'UserQuery+Foo'在'System.Linq.IQueryable`1[UserQuery+Foo]类型上不合法”。编译并运行同一查询时会引发异常

我该如何解决这个问题

void Main()
{
    var db = new MyDataContext( "..." );

    Expression < Func < DataContext, int, IQueryable < Foo > > > queryExpression = (DataContext dc, int unused) =>
        from ab in GetA(dc).Union( GetB(dc) )
        group ab by new { ab.Id, ab.Name } into grp
        select new Foo
        {
            Id = grp.Key.Id,
            Name = grp.Key.Name,
            Total = grp.Count()
        };

    var final = CompiledQuery.Compile ( queryExpression );

    var result1 = queryExpression.Compile () (db, 0);  // calling the original query works fine
    var result2 = final (db, 0);            // calling the compiled query throws an exception
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Total { get; set; }
}

IQueryable<Foo> GetA( DataContext db )
{
    return from b in db.GetTable<Bar>()
    where b.IsActive
    select new Foo { Id = b.Id, Name = b.Name };
}

IQueryable<Foo> GetB( DataContext db )
{
    return from b in db.GetTable<Bar>()
    where !b.IsActive
    select new Foo { Id = b.Id, Name = b.Name };
}
此查询抛出
NotSupportedException:Method'System.Linq.IQueryable``1[UserQuery+Foo]GetA(System.Data.Linq.DataContext)`不支持转换为SQL。


将对GetA的调用拖出到一个单独的变量赋值中,然后在查询中使用该变量将抛出一个
invalidoOperationException:Sequence包含多个元素
异常。

我猜linq编译器不理解返回IQueryable的方法


要编译它,这些方法可能必须返回某种形式的表达式。

我也有同样的问题,而我的诀窍似乎是分离出一个返回IQueryable的内联静态方法调用,以便我将这个延迟查询存储到一个变量中并引用它


我认为这是Linq to SQL中的一个缺陷,但至少有一个合理的解决方法。

我可以理解您的意思,但from子句的文档说明“from子句中引用的数据源必须具有IEnumerable、IEnumerable类型,或IQueryable等派生类型。”我想这意味着我需要从表达式而不是内置语言构建查询,但我不确定如何开始。
    Expression < Func < DataContext, int, IQueryable < Foo > > > queryExpression = (DataContext dc, int unused) =>
        from a in GetA(dc)
        select new Foo
        {
            Id = a.Id,
            Name = a.Name,
            Total = 42
        };
    Expression < Func < DataContext, int, IQueryable < Foo > > > queryExpression = (DataContext dc, int unused) =>
        from a in GetA(dc)
        select a;