(Linq/Lambda) 使用 2 个 DBContext 连接 2 个或更多表
Posted
技术标签:
【中文标题】(Linq/Lambda) 使用 2 个 DBContext 连接 2 个或更多表【英文标题】:(Linq/Lambda) Join 2 or more tables with 2 DBContext 【发布时间】:2015-05-14 11:16:10 【问题描述】:我遇到这样的错误:指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。
var employee = new ApplicationDbContext().Employee;
var otherTable = new OtherDbContext().OtherTable;
var returnValue = (from e in employee
join o in otherTable on e.Id equals o.Id
select new
e.Name,
e.Address,
o.Others
);
有任何解决方案吗? 谢谢!
【问题讨论】:
我不确定您是否可以跨两个上下文加入。 EF 必须以某种方式将其转换为 SQL 查询 无法同时查询两种上下文,请参阅此问题/答案:***.com/questions/4278993/… Employee或OtherTable的数据多吗? cmets 是正确的。请注意,连接方法的内部类型无论如何都是 IEnumerable,因此只需将第二个上下文(内部)的实体加载到 IEnumerable您通常应该实例化您的 DBContext,并且不要指定表/模型。 示例:
private ApplicationDBContext db = new ApplicationDbContext();
然后选择您是否仍将使用 LINQ 或 Raw SQL。我相信您更熟悉 SQL,因为您提到了连接表,那么为什么不使用它呢? Here's a tutorial on how to use Raw SQL.
If you still insist in using LINQ and involve join, here's a good reference for it.
【讨论】:
项目中的所有查询都使用 linq 或 lambda,如果我在这个特定的查询中使用原始 sql,它将是 unform 的。谢谢! 如果我们在SP 上执行此操作并创建一个linked server 而不是调用.ToList()
这会更好,这会导致查询所有内容。所以我会接受这个答案。【参考方案2】:
赌注解决方案是拥有一个 DbContext 与两个实体。这样 EF 可以很容易地在它们之间加入。您可以仅使用所需的字段再创建 2 个不同的实体。如果您担心维护重复类型,请考虑在它们之间创建接口(SOLID 的接口隔离主体)。这样,如果您更改字段的属性,请先通过接口执行此操作,它将强制您更正重复类型。
假设您无法更改现有的 ApplicationDbContext 和 OtherDbContext,您可以通过这种方式创建第三个 DbContext 和 2 个重复模型:
interface IEmployee string Name get; string Address get;
interface IOtherTable IEnumerable Others get;
public class Employee : IEmployee /* your existing class that may have more field*/
public class OtherTable : IOtherTable /* your existing class that may have other fiels*/
public class Employee2 : IEmployee /* Making this a subclass in a controller or something is preferred */
public class OtherTable2 : IOtherTable /* Making this a subclass in a controller or something is preferred */
public sealed class CombinedDbContext
public DbSet<Employee2> get; set;
public DbSet<OtherTable2> get; set;
现在您可以安全地执行此操作,而无需使用 hacky 代码...
var con = new CombinedDbContext();
var employee = con.Employee;
var otherTable = con.OtherTable;
var returnValue = (from e in employee
join o in otherTable on e.Id equals o.Id
select new
e.Name,
e.Address,
o.Others
);
【讨论】:
【参考方案3】:List<Employee> empList = new ApplicationDbContext().Employee.ToList();
List<OtherTable> othrList= new OtherDbContext().OtherTable.ToList();
var returnValue = (from e in empList
join o in othrList on e.Id equals o.Id
select new
e.Name,
e.Address,
o.Others
);
试试这个,它会起作用的.....
【讨论】:
感谢您的回复! .ToList() 正在查询所有的记录,所以可能会很紧张。你怎么看?其他解决方案? Manish,谢谢,但实例化每个实体只是为了进行连接是个坏主意。以上是关于(Linq/Lambda) 使用 2 个 DBContext 连接 2 个或更多表的主要内容,如果未能解决你的问题,请参考以下文章
在 LINQ Lambda 表达式中使用 GroupBy、Count 和 Sum