2012-05-28 61 views
3


我是linq和EF的首发。我有4个表如何加入linq的4张表

CurrencyUnit

CurrencyUnitID CurrencyName 
------------------------------- 
1     Dolar 
2     Pond 

请求

RequestID WayBillNo 
-------------------------- 
1   10000 
2   10001 

COSTTYPE

CostTypeID  CostName 
------------------------------- 
1     A 
2     B 

RequestCost

RequestId CostId  CurrencyUnitId  Amount Remark 
----------------------------------------------------------- 
1    1    1   200 
1    2    1   400 
2    2    2   1000 

我想加盟此4表,得到这样的结果

结果(表)

RequestId WayBillNo CostId CostName CurrencyUnitId CurrencyUnitName Amount Remark 
------------------------------------------------------------------------------------------ 
1   10000  1  A   1     Dollar  200  
1   10000  2   B   2     Pond   400 
2   10001  1   A   0        0 
2   10001  2   B   2    Pond   1000 

我写这篇文章的查询

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 Amount Remark


1   10000  1  A   1     Dollar  200  
1   10000  2   B   2     Pond   400 
2   10001  2   B   2    Pond   1000 

即 如果请求不符合成本显示该请求的所有成本和设定量值0,例如桌子有4行,但乙表具有表A 3行用于请求2成本1设定量0但在表B没有设置,我想设置。

+0

你想执行一个内部或外部连接吗? – munissor

+0

嗨,检查答案的查询............ –

+0

@munissor:外部 – Pouya

回答

0

,你可以这样写代码的情况下

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 
           }; 
6

编辑

尽量左外连接在像如下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>", 
     } 

这样对你的查询根据你表将

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      
     } 

查看帖子了解更多详情:SQL to LINQ (Visual Representation)

图像显示了如何在LINQ的加入工作 enter image description here

+0

更新查询在Questin,但得到错误,感谢您的帮助我。 – Pouya

+0

@mohsen - 你需要包含你的“上下文”对象为我给出的每个集合查询是你如何实现它用“context.youobject”集合取代每个对象集合 –

+0

:更新我的问题。请帮帮我。谢谢 – Pouya

1

在左外连接(假设FK在RequestCost可以为null)

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      
     } 
+0

更新我的问题。请帮帮我。谢谢 – Pouya

0

您也可以使用此代码

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();