Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF中的多表联接_Entity Framework - Fatal编程技术网

Entity framework EF中的多表联接

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

在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.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);
然后我可以将其作为IQuerayble返回,并进一步使用它:

var 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)将添加到我的问题中。。。