LINQ EF 连接来自 2 个不同数据上下文的查询

Qua*_*s1m 5 c# sql linq asp.net entity-framework

我正在使用 LINQ 从我的 EF 上下文以及 Asp .Net Identity 2.0 中检索数据——两者都位于同一个 MS SQL Server 数据库中。

我的问题是 LINQ 将它们视为 2 种不同的数据上下文情况,并且无法处理查询。

"The specified LINQ expression contains references to queries that are associated with different contexts."
Run Code Online (Sandbox Code Playgroud)

我想要实现的是从 EF 表中简单返回 10 个顶级项目(我在代码摘录中跳过了这一点),之前按 ASP .NET Identity 表中的 UserName 排序。

我在 StackOverflow 上看到了一些关于这个问题的案例,但我无法在我的案例中应用任何解决方案。

首选的解决方案当然是不要下载所有表数据并在服务器上进行排序。

有问题的查询:

var dbDataSorted = from entry in dbData
        join user in this.UserManager.Users
        on entry.UserId equals new Guid(user.Id)
        orderby user.UserName ascending
        select entry;
return dbDataSorted;
Run Code Online (Sandbox Code Playgroud)

Bri*_*vis 5

通过使用 AsEnumerable(),我能够在我的案例中使用它。天啊。

在你的情况下:

var dbDataSorted = from entry in dbData.AsEnumerable()
    join user in this.UserManager.Users
    on entry.UserId equals new Guid(user.Id)
    orderby user.UserName ascending
    select entry;
return dbDataSorted;
Run Code Online (Sandbox Code Playgroud)

  • AsEnumerable() 之所以起作用,是因为它强制在客户端执行该部分查询。只要 dbData 不返回大量记录,它就可以在大多数情况下正常工作。 (2认同)

Mar*_*ijn 3

LINQ 和 EF 非常酷。但有时,它的抽象并不能提供您所需要的东西。

只需回到基础,手动编写查询,将其放入字符串中,yourcontext.YourDbSet使用 SqlQuery 方法运行它,然后就完成了。

var query = @"SELECT * FROM dbData as entry
              INNER JOIN Users
              ON entry.UserId = Users.Id
              ORDER BY Users.Username";

yourcontext.dbData.SqlQuery(query);
Run Code Online (Sandbox Code Playgroud)

如果提供给您的抽象不能满足您的需要,那么滥用抽象来做一些奇怪的事情远不如使用较低级别的接口那么清晰。