簡體   English   中英

錯誤:“指定的LINQ表達式包含對與不同上下文關聯的查詢的引用”

[英]Error: “The specified LINQ expression contains references to queries that are associated with different contexts”

我收到LINQ查詢標題中顯示的錯誤,該查詢包括來自兩個不同edmx文件的兩個表。 這是查詢:

var query = (from a in db1.Table1
           join b in db1.Table2 on a.Id equals b.Id
           orderby a.Status
           where b.Id == 1 && a.Status == "new"
           select new
           {
               Id = a.Id,
               CompanyId = (from c in db2.Company
                            where s.Id == a.Id
                            select
                            new { c.CompanyId })
           });

db1db2是與兩個不同edmx文件關聯的上下文。 我怎樣才能克服這個錯誤?

您將不得不執行兩個數據庫查詢:

var IDs =  (from a in db1.Table1 
            join b in db1.Table2 on a.Id equals b.Id 
            orderby a.Status 
            where b.Id == 1 && a.Status == "new" 
            select new a.Id).ToArray();

var query = from c in db2.Company
            join a in IDs on c.Id equals a.Id
            select new { Id = a.Id, CompanyId = c.CompanyId };

.ToArray()是至關重要的。 它阻止EF嘗試執行組合查詢(由於它使用兩個不同的上下文,因此會失敗)。 如果您寧願保持延遲加載,可以使用.AsEnumerable()


還有你的后續問題:

有沒有其他方法可以使LINQ查詢更加優化? 也就是說,在單個LINQ查詢本身中執行操作?

為了使您的原始查詢成功運行,它必須僅使用單個數據上下文,這意味着所有數據必須來自單個EDMX,這反過來意味着單個連接字符串。 有幾種方法可以實現這一目標:

  • 如果兩個表都在同一個數據庫中,請將它們都添加到單個EDMX中。
  • 如果它們位於不同的數據庫上,但位於同一實例上,則在其中一個數據庫上創建一個視圖,該數據庫從另一個數據庫中的表中進行選擇,然后將本地表和視圖添加到單個EDMX中。
  • 如果它們位於不同的實例/服務器上,則創建鏈接服務器,然后在鏈接服務器上創建表的視圖,然后將本地表和視圖添加到單個EDMX。

您需要將第二個表添加到第一個上下文的模型中。 如果這是在多個數據庫中,則需要使用Linq to Objects連接進行輔助查找客戶端。

您必須手動創建EntityConnection,其中包含您要使用的所有.EDMX中的資源。 您可以通過添加到app.config或programmaticaly的連接來實現。 然后,您可以使用准備好的EntityConnection創建DBContext。

方法a)

<add name="MyConnection"
connectionString="metadata=res://*/Entities.ModuleA.csdl|res://*/Entities.ModuleA.ssdl|res://*/Entities.ModuleA.msl|res://*/Entities.ModuleB.csdl|res://*/Entities.ModuleB.ssdl|res://*/Entities.ModuleB.msl;
provider=System.Data.SqlClient;provider connection string=&quot;MyConnectionString&quot;"
providerName="System.Data.EntityClient" />

using (EntityConnection oEntityConnection =
    new EntityConnection("name=MyConnection"))
{
    using(DbContext oDBContext = new DbContext(oEntityConnection))
    {
        //your code - available are entities declared in Entities.ModuleA and Entities.ModuleB
    }
}

方法b)

 using (EntityConnection oEntityConnection =
        new EntityConnection(new MetadataWorkspace(
        new string [] { 
"res://Entities.ModuleA/", 
"res://Entities.ModuleB/" 
},
        new Assembly[] { 
Assembly.GetAssembly(typeof(Entities.ModuleA.AnyType)),
Assembly.GetAssembly(typeof(Entities.ModuleB.AnyType)) 
}
        )))
    {
        using(DbContext oDBContext = new DbContext(oEntityConnection))
        {
            //your code - available are entities declared in Entities.ModuleA and Entities.ModuleB
        }
    }

暫無
暫無

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

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