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