Entity framework EF中的多表联接
在SQL Server中,我有以下查询:Entity framework EF中的多表联接,entity-framework,Entity Framework,在SQL Server中,我有以下查询: SELECT cvs.* FROM dbo.ClientVoiceSetup cvs WHERE cvs.EnrollmentCode = 74311 /** Apply Vendor Data Scope **/ AND cvs.ClientID IN ( SELECT DISTINCT cc.client_id FROM cli_case cc INNER JOIN cli_case_plan ccp ON cc.cas
SELECT cvs.*
FROM dbo.ClientVoiceSetup cvs
WHERE cvs.EnrollmentCode = 74311
/** Apply Vendor Data Scope **/
AND cvs.ClientID IN (
SELECT DISTINCT cc.client_id
FROM cli_case cc
INNER JOIN cli_case_plan ccp ON cc.case_id = ccp.case_id
INNER JOIN service_plan sp ON ccp.service_plan_id = sp.service_plan_id
INNER JOIN VendorServicePlan vsp ON sp.service_plan_id = vsp.ServicePlanID
/** Apply Vendor ID from login **/
WHERE vsp.VendorID = 4)
注意:在SQL中,客户端cli\u case cli\u case\u计划没有定义任何FKs。服务计划供应商或服务计划供应商定义了FKs,其中供应商服务计划仅为多对多联接表
子查询是一个数据范围筛选器,将应用于多个不同的调用。当我把DB拖入EF时,我得到了一个稍微不同的结构。我拥有以下实体:
客户
cli_案例
cli\u案例\u计划
服务计划(带有供应商ICollection)
供应商(带有服务计划i集合)
我创建了以下加入代码:
var q = (from cc in context.cli_case
join ccp in context.cli_case_plan on cc.case_id equals ccp.case_id
join sp in context.service_plan on ccp.service_plan_id equals sp.service_plan_id
select cc.client_id);
return q.ToList();
关于如何为VendorID==myInput添加“WHERE子句”,我还是个空白
作为旁注:我很想弄清楚如何返回未实现的EF语句,而不是DB调用的结果。长期的想法是将此语句作为过滤器注入到“正常”EF调用中,以便在具体化时包含过滤。(既然可以调用DB一次,为什么还要调用它两次呢?)除非有更好的方法?找到了答案
LINQ for SQL
var p = (from cc in context.cli_case
join ccp in context.cli_case_plan on cc.case_id equals ccp.case_id
join sp in context.service_plan on ccp.service_plan_id equals sp.service_plan_id
where sp.Vendors.Any(a => a.VendorID == vendorId)
select cc.client_id);
对象的LINQ
var q = context.cli_case.Join(context.cli_case_plan, cc => cc.case_id, ccp => ccp.case_id, (cc, ccp) => new {cc, ccp})
.Join(context.service_plan, @t => @t.ccp.service_plan_id, sp => sp.service_plan_id, (@t, sp) => new {@t, sp})
.Where(ven => ven.sp.Vendors.Any(a => a.VendorID == vendorId))
.Select(a => a.@t.cc.client_id);
然后我可以将其作为IQuerayblevar enrollmentCode = 13524;
// provides the underlying SQL, does not hit the DB...
var clientList = db.GetClientIdListFromVendorId(4);
// set WHERE clause to filter on enrollmentCode and allowed client list...
var q = db.ClientSetups
.Where(a => a.EnrollmentCode == enrollmentCode
&& clientList.Contains(a.ClientID))
.ToList();
最后一个连接在哪里?这就是我试图弄清楚的…
sp.Vendors.Contains(inputVendorId)
?弄清楚了:sp.Vendors.Any(a=>a.VendorID==VendorID)将添加到我的问题中。。。