如何联合两个多个dbcontext,我们这里有两个dbcontext,它们具有相同的属性,需要连接两个DB context。两种方案都存在于同一个数据库中。
public class Employee
{
public string employeeid { get; set; }
public string Name { get; set; }
public string FullName { get; set; }
public string MobileNumber { get; set; }
public string Age { get; set; }
}
public class EmployeeService
{
private readonly IEmployee _employeeserice;
private readonly IEmployeeArchive _employeearchiveService;
public EmployeeService(IEmployee employeeservice, IEmployeeArchive employeearchiveService)
{
_employeeserice = employeeservice;
_employeearchiveService = employeearchiveService;
}
}
public List<Employee> Resuts(int employeeid)
{
var employee = _employeeserice.Queryable().Where(q => q.employeeid == employeeid);
var employeearchive = _employeearchiveService.Queryable().Where(q => q.employeeid == employeeid);
return employee.contact(employeearchive);
}
两个dbcontext结果的并集
如果两个上下文都在同一个数据库中,那么考虑不使用不同的上下文,而只在单个上下文中进行连接。
如果它们是独立的数据库,您需要做的是独立地查询每个数据库,然后将结果连接到内存中(而不是数据库引擎中)。
例如:
var foos = contextA.Foos.Where(foo => foo.Field > 10).ToArray();
var bars = contextB.Bars.Where(bar => bar.AnotherField == "something").ToList();
var join = foos.Join(
bars,
inner => inner.ForeignKey,
outer => outer.Key,
(inner,outer) => new {
Foo = inner,
Bar = outer
}
);
在上面的例子中,ToArray
和ToList
方法都具体化了查询,查询每个上下文对应的数据库,返回结果并读入程序内存。
两个集合随后在内存中连接。
因为连接发生在内存中,所以应该通过适当的过滤来限制查询结果的数量。另外,您可以使用Select
操作来只选择您感兴趣的字段。
如果您想执行不同类型的连接,请查看GroupJoin
操作,它允许您执行外部连接。
假设您希望从签名返回List
,并且不希望有跨上下文查询,那么应该执行以下操作(使用AsEnumerable
从SQL生成切换到客户端处理):
public List<Employee> Resuts(int employeeid)
{
var employee = _employeeserice.Queryable().Where(q => q.employeeid == employeeid);
var employeearchive = _employeearchiveService.Queryable().Where(q => q.employeeid == employeeid);
return employee.AsEnumerable().Contact(employeearchive).ToList();
}
如果您想从两个上下文中查询表"服务器端"那么更好的选择是将表添加到一个上下文中。
也许你应该考虑使用异步查询。