繁体   English   中英

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

[英]LINQ EF Join query from 2 different data context

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

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

"The specified LINQ expression contains references to queries that are associated with different contexts."

我要实现的是从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;

您不能在一个查询中使用Linq to Entities和Linq来对象。 这是因为当您对IQueryable接口的实例进行查询时,查询将转换为SQL,而在SQL中,您将无法使用任何IEnumerable集合。 因此,您应该从数据库中获取数据(例如dbData.AsEnumerable())。 但是,如果您想在SQL Server端完成所有工作,最简单的方法是创建sql过程,并将users表作为参数传递。 将用户表作为xml传递并比在服务器端的过程中解析它最简单的方法。

LINQ和EF非常酷。 但是有时候,它的抽象无法满足您的需求。

只是回到基础,手工编写查询,将其放入字符串中,使用SqlQuery方法针对yourcontext.YourDbSet进行运行yourcontext.YourDbSet

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

yourcontext.dbData.SqlQuery(query);

如果提供给您的抽象无法满足您的需求,那么与使用较低级别的接口相比,滥用这些抽象来做一些奇怪的事情要困难得多。

我可以使用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;

如果您首先使用ASP.NET Identity 2,则DbContext大概继承自IdentityDbContext<> ,因此您可以直接从上下文访问Users表。 您不需要使用UserManager来访问用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM