从多个上下文连接LINQ查询
我正在尝试为要在视图中显示的数据创建ViewModel。问题是,显示的数据分布在两个数据库中,每个数据库中有多个表。我已经读到不能跨多个上下文连接Linq查询,这是有道理的,而且我还读到我们不能在EF5中首先使用代码来使用存储过程……这导致我使用了3个不同的Linq查询,并试图将它们组合到一个ViewModel中……我只是不确定如何实现 以下是我的Linq查询:从多个上下文连接LINQ查询,linq,asp.net-mvc-4,ef-code-first,Linq,Asp.net Mvc 4,Ef Code First,我正在尝试为要在视图中显示的数据创建ViewModel。问题是,显示的数据分布在两个数据库中,每个数据库中有多个表。我已经读到不能跨多个上下文连接Linq查询,这是有道理的,而且我还读到我们不能在EF5中首先使用代码来使用存储过程……这导致我使用了3个不同的Linq查询,并试图将它们组合到一个ViewModel中……我只是不确定如何实现 以下是我的Linq查询: var csdContext = new CSDContext(CustomerCode); var masterContext =
var csdContext = new CSDContext(CustomerCode);
var masterContext = new MasterContext();
//Only returns 1 row - which is what we want.
List<Site> sites = (from s in csdContext.Sites
join sa in csdContext.SiteAddresses
on s.SiteID equals sa.SiteID
join a in csdContext.Addresses
on sa.AddressID equals a.AddressID
join spv in csdContext.SiteProductVersions
on s.SiteID equals spv.ProductVersionID
where s.SiteID == id
select s).ToList();
//List
List<States> states = (from s in masterContext.StatesTable
select s).ToList();
基本上,我需要这些表中的以下数据:csdContext-地址
地址
地址2
城市
ZipCode
csdContext-站点
OfficePhone
移动电话
备用电话
csdContext-SiteProductVersions
ProductVersionID
主上下文-状态
状态代码
以下是在SQL中联接表的方式:
SELECT csd_a.Address, csd_a.Address2, csd_a.City, mstr_st.StateCode, csd_a.ZipCode, csd_s.OfficePhone, csd_s.MobilePhone,
csd_s.AlternativePhone, csd_spv.ProductVersionID
FROM CSD.dbo.Sites AS csd_s
INNER JOIN CSD.dbo.SiteAddress AS csd_sa ON csd_sa.SiteID = csd_s.SiteID
INNER JOIN CSD.dbo.Address AS csd_a ON csd_a.AddressID = csd_sa.AddressID
INNER JOIN CSD.dbo.SiteProductVersions AS csd_spv ON csd_s.SiteID = csd_spv.SiteID
INNER JOIN MasterDB.dbo.States AS mstr_st ON mstr_st.StateID = csd_a.StateID
我不知道如何合并这3个结果来创建SiteDetailsViewModel的ViewModel数据。有人能帮忙吗?那你为什么不这样写呢:
public class SiteDetailsViewModel
{
public string Address { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string StateCode { get; set; }
public string ZipCode { get; set; }
public string OfficePhone { get; set; }
public string MobilePhone { get; set; }
public string AlternativePhone { get; set; }
public int ProductVersionID { get; set; }
}
from ...
...
where s.SiteID == id
select new SiteDetailsViewModel()
{
Address = sa.Address,
Address2 = as.Address2,
..
}
如果您按照OP中的描述具体化查询,您可以使用:
var query = sites.Join(
states,
si => si.StateID,
st => st.StateID,
(si, st) => new SiteDetailsViewModel
{
Address = si.Address,
Address2 = si.Address2,
City = si.City,
StateCode = st.StateCode,
ZipCode = si.ZipCode,
OfficePhone = si.OfficePhone,
MobilePhone = si.MobilePhone,
AlternativePhone = si.AlternativePhone,
ProductVersionID = siProductVersionID
});
一种可能的替代解决方案是在DB#1中的表的DB#2中创建视图。然后,您可以在EF for DB#2中对这些视图进行建模/映射。当然,如果需要更新任何表,您仍然需要DB#1的上下文。但此解决方案的好处是,您可以在单个上下文上执行所有读取访问,并在服务器上而不是在内存中获取联接。因为我需要位于另一个上下文中的States表中的“StateCode”。问题是关于“…”部分。如果您使用OP.ToList()中描述的代码,则无法判断具体化了查询,并且它们尚未连接到上下文。它们只是内存中的列表。是什么阻止您在第一次查询中使用
join
,并将另一个上下文放在那里?无法使用EF跨不同上下文进行连接。