如何联合/连接多个Db上下文?



如何联合两个多个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
}
);

在上面的例子中,ToArrayToList方法都具体化了查询,查询每个上下文对应的数据库,返回结果并读入程序内存。

两个集合随后在内存中连接。

因为连接发生在内存中,所以应该通过适当的过滤来限制查询结果的数量。另外,您可以使用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();
}

如果您想从两个上下文中查询表"服务器端"那么更好的选择是将表添加到一个上下文中。

也许你应该考虑使用异步查询。

最新更新