我对linq很新,我需要加入两个具有以下要求的表:
应该加入t1和t2。
如果t2为空,则查询不应失败 - 应使用默认值。
我的查询:
var final = from t1 in saDist.AsEnumerable()
from t2 in sapGrouped.AsEnumerable()
where
t1.Supplier.Id == t2.Supplier.Id && t1.VatRate == t2.VatRate
select
new
{
t1.Supplier,
Amount = t1.Amount - t2.Amount,
Advance = t1.Advance - t2.Advance,
Balance = t1.Balance - t2.Balance,
t1.VatRate
};
有人可以纠正这个吗?
答案 0 :(得分:2)
这适用于Linqpad作为C#程序。
基本上你的连接语法需要调整(参见this),你需要考虑什么时候没有什么可以加入“t2”(所以我们做空检查并在null时使用0,否则t2.Amount等)
我创建了一些虚拟数据,因此你可以玩。
有关其他示例,请参阅http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/。
我希望它可以做你想做的事。
谢谢, 多米尼克
public class A { void Main() { Distributor dist1 = new Distributor() { SupplierID = 1, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "A", DeptSupplierID = 1 }; Distributor dist2 = new Distributor() { SupplierID = 2, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "B", DeptSupplierID = 1 }; Distributor dist3 = new Distributor() { SupplierID = 3, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "C", DeptSupplierID = 1 }; Distributor dist4 = new Distributor() { SupplierID = 4, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "D", DeptSupplierID = 2 }; Distributor dist5 = new Distributor() { SupplierID = 5, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "E", DeptSupplierID = 2 }; Distributor dist6 = new Distributor() { SupplierID = 6, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "F", DeptSupplierID = 2 }; Distributor dist7 = new Distributor() { SupplierID = 7, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "G", DeptSupplierID = 6 }; Distributor dist8 = new Distributor() { SupplierID = 8, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "H", DeptSupplierID = 3 }; Distributor dist9 = new Distributor() { SupplierID = 9, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "I", DeptSupplierID = 3 }; Distributor dist10 = new Distributor() { SupplierID = 10, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "J", DeptSupplierID = 7 }; Distributor dist11 = new Distributor() { SupplierID = 11, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "K", DeptSupplierID = 7 }; Distributor dist12 = new Distributor() { SupplierID = 12, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "L", DeptSupplierID = 5 }; SAPGroup Dept1 = new SAPGroup() { SupplierID = 1, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "Development" }; SAPGroup Dept2 = new SAPGroup() { SupplierID = 2, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "Testing" }; SAPGroup Dept3 = new SAPGroup() { SupplierID = 3, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "Marketing" }; SAPGroup Dept4 = new SAPGroup() { SupplierID = 4, Amount = 3, Balance = 4, Advance = 3, VatRateID = 1, Name = "Support" }; List ListOfDistributors = new List(); ListOfDistributors.AddRange((new Distributor[] { dist1, dist2, dist3, dist4, dist5, dist6, dist7, dist8, dist9, dist10, dist11, dist12 })); List ListOfSAPGroup = new List(); ListOfSAPGroup.AddRange(new SAPGroup[] { Dept1, Dept2, Dept3, Dept4 }); var final = from t1 in ListOfDistributors join t2 in ListOfSAPGroup on new { t1.SupplierID, t1.VatRateID } equals new { t2.SupplierID, t2.VatRateID } into JoinedDistAndGrouped from t2 in JoinedDistAndGrouped.DefaultIfEmpty() select new { Name1 = t1.Name, Name2 = (t2 == null) ? "no name" : t2.Name, SupplierID = t1.SupplierID, Amount = t1.Amount - (t2 == null ? 0 : t2.Amount), Advance = t1.Advance - (t2 == null ? 0 : t2.Advance), Balance = t1.Advance - (t2 == null ? 0 : t2.Balance), VatRateID = t1.VatRateID }; final.Dump(); } } class Distributor { public string Name { get; set; } public int SupplierID { get; set; } public int VatRateID { get; set; } public int DeptSupplierID { get; set; } public int Amount { get; set; } public int Advance { get; set; } public int Balance { get; set; } } class SAPGroup { public int SupplierID { get; set; } public int VatRateID { get; set; } public string Name { get; set; } public int Amount { get; set; } public int Advance { get; set; } public int Balance { get; set; } } public class Result { public string Name1 { get; set; } public string Name2 { get; set; } public int SupplierID { get; set; } public int Amount { get; set; } public int Advance { get; set; } public int Balance { get; set; } public int VatRateID { get; set; } }
答案 1 :(得分:2)
感谢您的投入。没有一个答案符合我的要求,但我设法让原始代码正常工作:
var final = from t2 in saDist.AsEnumerable()
from t1 in sapGrouped.AsEnumerable().DefaultIfEmpty()
where
t1 == null || (t2.Supplier.Id == t1.Supplier.Id && t2.VatRate == t1.VatRate)
select
new
{
t2.Supplier,
Amount = t2.Amount - (t1 == null ? 0 : t1.Amount),
Advance = t2.Advance - (t1 == null ? 0 : t1.Advance),
Balance = t2.Balance - (t1 == null ? 0 : t1.Balance),
t2.VatRate
};
如果您对此有任何意见或改进,请告诉我,谢谢。
答案 2 :(得分:0)
根据this,您正在寻找类似的东西(这是未经测试的,但希望能引导您走上正轨):
var final = from t1 in saDist.AsEnumerable()
join t2 in sapGrouped.AsEnumerable()
on t1.Supplier.Id equals t2.Supplier.Id
and t1.VatRate equals t2.VatRate into t1_t2 //not sure about this line
from t2 in t1_t2.DefaultIfEmpty()
{
t1.Supplier,
Amount = t1.Amount - t2.Amount,
Advance = t1.Advance - t2.Advance,
Balance = t1.Balance - t2.Balance,
t1.VatRate
};
注意.DefaultIfEmpty()
,这满足:“如果t2为空,那么查询不应该失败 - 应该使用默认值。”