Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# 如何在linq中连接4个表_C#_Linq_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 如何在linq中连接4个表

C# 如何在linq中连接4个表,c#,linq,entity-framework,entity-framework-4,C#,Linq,Entity Framework,Entity Framework 4,我是linq和EF的先发球员。我有4张桌子 货币单位 CurrencyUnitID CurrencyName ------------------------------- 1 Dolar 2 Pond 请求 RequestID WayBillNo -------------------------- 1 10000 2 10001 成本类型 CostTypeI


我是linq和EF的先发球员。我有4张桌子

货币单位

CurrencyUnitID    CurrencyName
-------------------------------
1                    Dolar
2                    Pond
请求

RequestID    WayBillNo
--------------------------
1            10000
2            10001
成本类型

CostTypeID      CostName
-------------------------------
1                 A
2                 B
请求成本

RequestId    CostId     CurrencyUnitId     Amount   Remark
-----------------------------------------------------------
1              1              1            200
1              2              1            400
2              2              2            1000
我想加入这个4表并得到这个结果

结果(表格)

我写这个查询

  var items = (from rc in context.CLEARANCE_COST
                join c in context.COST_TYPES on rc.COST_ID equals c.COST_ID 
                join d in context.CLEARANCE_REQUEST on rc.REQUEST_ID equals d.REQUEST_ID
                join f in context.CURRENCY_UNITS on rc.CURRENCY_ID equals f.CURRENCY_ID 
                select new
                           {

                               rc.COST_AMOUNT,
                               c.COST_ID,
                               c.COST_NAME,
                               d.WAYBILL_NO,
                               f.CURRENCY_NAME
                           }).ToList();
但是得到这个结果(B表)

RequestId WayBillNo CostId CostName CurrencyUnitId CurrencyUnitName金额备注


即 如果请求没有成本显示此请求的所有成本并设置金额值0,例如,表A中有4行,但表B中有3行用于请求2成本1设置金额0,但表B中未设置,则我希望设置。

编辑

在linq中尝试左外连接,如下所示

var query=
    from rc in RequestCost
    join c in CostType on rc.CostId    = c.CostTypeID into RCC
    from rcc in RCC.DefaultIfEmpty() 
    join r in Request on  rc.RequestID = r.RequestID  into RCR
    from rcr in RCR.DefaultIfEmpty()   
    join cu in CurrencyUnit 
    on rc.CurrencyUnitId  = cu.CurrencyUnitID into RCCU
    from rccu in RCCU..DefaultIfEmpty() 

    select new 
       { 
          RequestId = rc.RequestId,
          WayBillNo = rcr != null ? rcr.WayBillNo : "<No WayBillNo>",
          CostId = rc.CostId,
          CostName = rcc != null ? rcc.CostName : "<No CostName>",
          CurrencyUnitID= rc.CurrencyUnitID,
          CurrencyName = rccu != null ? rccu.CurrencyName: "<No CurrencyName>",
          Amount = rc.Amount != null ? rc.Amount : 0 ,
          Remark = rc.Remark != null ? rc.Remark : "<No Remark>",
       }
查看帖子了解更多详细信息:

图显示了连接在linq中的工作方式

如果是左外部联接(假设RequestCost中的FK可以为空)


您可以编写此代码

 var items = from c in context.COST_TYPES
                    join o in context.CLEARANCE_COST .Where(d=>d.REQUEST_ID==8) on c.COST_ID equals o.COST_ID into outer
                    from o in outer.DefaultIfEmpty()
                    select new
                               {
                                   o.CLEARANCE_REQUEST.WAYBILL_NO,
                                   c.COST_NAME,
                                   o.CURRENCY_UNITS.CURRENCY_NAME,
                                   Amount=o==null?0:o.COST_AMOUNT
                               };

您也可以编写此代码

public class Request()
{
          public int RequestId    { get; set; }
          public RequestCost RequestCost { get; set; }
}

public class RequestCost ()
{
          public int RequestId    { get; set; }
          public CostType CostType { get; set; }
          public CurrencyUnit CurrencyUnit{ get; set; }
}

  var items = context.dbRequest.include("RequestCost")
                                   .include("RequestCost.CurrencyUnit")
                                  .include("RequestCost.CostType").ToList();

您想执行内部联接还是外部联接?您好,请检查答案的查询………您想要什么结果?我没法回答你的问题,请帮帮我。thankshi check my EDITed anser可能适用于您……:)@mohsen-您需要为我提供的每个集合包含“上下文”对象查询是如何实现的,请将每个对象集合替换为“context.youobject”集合
var query=
    from rc in RequestCost
    join c in CostType on rc.CostId    = c.CostTypeID
    join r in Request on  rc.RequestID = r.RequestID    
    join cu in CurrencyUnit on rc.CurrencyUnitId  = cu.CurrencyUnitID 

    select new 
       { 
          rc.RequestId,
          r.WayBillNo,
          rc.CostId,
          c.CostName 
          rc.CurrencyUnitID,
          cu.CurrencyName,
          rc.Amount,
          rc.Remark                     
       }
var query=
    from rc in RequestCost
    join c in CostType on rc.CostId equals c.CostTypeID into ctype
    join r in Request on  rc.RequestID equals r.RequestID into req
    join cu in CurrencyUnit on rc.CurrencyUnitId equals cu.CurrencyUnitID into unit

    select new 
       { 
          rc.RequestId,
          req.FirstOfDefault() != null ? req.FirstOfDefault().WayBillNo : null,
          rc.CostId,
          ctype.FirstOfDefault() != null ? ctype.FirstOfDefault().CostName : null,
          rc.CurrencyUnitID,
          ctype.FirstOfDefault() != null ? ctype.FirstOfDefault().CurrencyName : null,
          rc.Amount,
          rc.Remark                     
       }
 var items = from c in context.COST_TYPES
                    join o in context.CLEARANCE_COST .Where(d=>d.REQUEST_ID==8) on c.COST_ID equals o.COST_ID into outer
                    from o in outer.DefaultIfEmpty()
                    select new
                               {
                                   o.CLEARANCE_REQUEST.WAYBILL_NO,
                                   c.COST_NAME,
                                   o.CURRENCY_UNITS.CURRENCY_NAME,
                                   Amount=o==null?0:o.COST_AMOUNT
                               };
public class Request()
{
          public int RequestId    { get; set; }
          public RequestCost RequestCost { get; set; }
}

public class RequestCost ()
{
          public int RequestId    { get; set; }
          public CostType CostType { get; set; }
          public CurrencyUnit CurrencyUnit{ get; set; }
}

  var items = context.dbRequest.include("RequestCost")
                                   .include("RequestCost.CurrencyUnit")
                                  .include("RequestCost.CostType").ToList();