簡體   English   中英

帶有聯合查詢和已編譯查詢的LINQ-to-SQL“成員訪問類型不合法”異常

[英]LINQ-to-SQL “Member access not legal on type” exception with unioned and compiled query

我有多個查詢要合並在一起,然后編譯整個內容。 未編譯的查詢運行正常,但是“ InvalidOperationException:'UserQuery + Foo'的成員訪問'Int32 Id'在類型'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 };
}

編輯

看起來並集和分組無關。 從查詢中刪除這些元素仍然會在編譯時導致異常:

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

dc.GetTable<Bar>()替換對GetA(dc)的調用並添加where子句可解決此問題。

因此,對於已編譯的查詢而言,將這樣的單獨查詢連接在一起是不可能的嗎?

編輯#2

詹姆斯的回答打在了頭上。 簡化查詢甚至進一步揭示了根本問題:

    Expression < Func < DataContext, int, IQueryable < Foo > > > queryExpression = (DataContext dc, int unused) =>
        from a in GetA(dc)
        select a;

該查詢引發NotSupportedException: Method 'System.Linq.IQueryable``1[UserQuery+Foo] GetA(System.Data.Linq.DataContext)' has no supported translation to SQL.

將對GetA的調用拉到一個單獨的變量分配中,然后在查詢中使用該變量將引發InvalidOperationException: Sequence contains more than one element異常。

我的猜測是linq編譯器無法理解返回IQueryable的方法。

要對其進行編譯,這些方法可能必須返回某種形式的Expression <>。

我遇到了同樣的問題,看來對我有用的把戲是分離出一個返回IQueryable <>的內聯靜態方法調用,以便我將此延遲查詢存儲到一個變量中並對其進行引用。

我認為這是Linq to SQL中的錯誤,但至少有一個合理的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM