[英]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.