完全外部将两个单独的 class 列表连接到第三个 class 的第三个列表中
Full outer join two lists of separate classes into a third list of a third class
我正在尝试完全外部连接两个列表(单独的 类),我必须这样做的原因是因为我需要来自我系统的所有订单,以及来自另一个系统的订单.有些订单与订单号匹配,有些不匹配't.But我仍然想在网格中显示所有订单。
两个界面是这样的
interface IOrderInternal
{
int ID { get; } // My systems inernal ID
string NO_Order { get; } // My external ID
DateTime? OrderDate { get; }
}
interface IOrderExternal
{
int ID { get; } // External systems internal ID
string ProjectNumber{ get; }
}
这两个接口的连接最终应该是
interface IOrderInternal
{
int ID_IN { get; set; }
int ID_EX { get; set; }
string ProjectNumber{ get; set; }
DateTime OrderDate { get; set; }
}
所以两个列表被传入一个函数,应该完全外部连接它们,基于 NO_Order = ProjectNumber
IList<IOrderInternal> INOrders
IList<IOrderExternal> EXOrders
var leftJoin = from exorder in EXOrders
join inorder in INOrders
on exorder.ProjectNumber equals inorder.NO_Order
into temp
from inorder in temp
select new Order
{
ID_IN = inorder == null ? default(int) : inorder.ID,
ID_EX = exorder.ID,
ProjectNumber = inorder == null ? default(string) : inorder.NO_Order
OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate
};
var rightJoin = from inorderin INOrders
join exorderin EXOrders
on inorder.NO_Order equals exorder.ProjectNumber
into temp
from exorder in temp
select new Order
{
ID_IN = inorder.ID,
ID_EX = exorder == null? default(int) : exorder.ID,
ProjectNumber = inorder.NO_Order
OrderDate = inorder.OrderDate
};
var joinedList = leftJoin.Union(rightJoin);
当我加入列表时,我只得到内部加入的结果。但是我需要知道所有订单的总数。
感谢任何帮助:)
如果我没理解错的话,您想在任一方向进行外部联接,然后将结果连接在一起?这就是我在 linq 中进行左连接的方式:
IList<IOrderInternal> INOrders
IList<IOrderExternal> EXOrders
var leftJoin = from exorder in EXOrders
from inorder in INOrders.Where(x => exorder.ProjectNumber == x.NO_Order).DefaultIfEmpty()
select new Order
{
ID_IN = inorder == null ? default(int) : inorder.ID,
ID_EX = exorder.ID,
ProjectNumber = inorder == null ? default(string) : inorder.NO_Order
OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate
};
var rightJoin = from inorderin INOrders
from exorderin EXOrders.Where(x => inorder.NO_Order == x.ProjectNumber).DefaultIfEmpty()
select new Order
{
ID_IN = inorder.ID,
ID_EX = exorder == null? default(int) : exorder.ID,
ProjectNumber = inorder.NO_Order
OrderDate = inorder.OrderDate
};
var joinedList = leftJoin.Union(rightJoin);
我喜欢这种方式,因为它使左连接全部在一行中,但如果您想继续使用您的语法,我认为您只需将 temp
更改为 temp.DefaultIfEmpty()
每个查询让它工作。
我正在尝试完全外部连接两个列表(单独的 类),我必须这样做的原因是因为我需要来自我系统的所有订单,以及来自另一个系统的订单.有些订单与订单号匹配,有些不匹配't.But我仍然想在网格中显示所有订单。
两个界面是这样的
interface IOrderInternal
{
int ID { get; } // My systems inernal ID
string NO_Order { get; } // My external ID
DateTime? OrderDate { get; }
}
interface IOrderExternal
{
int ID { get; } // External systems internal ID
string ProjectNumber{ get; }
}
这两个接口的连接最终应该是
interface IOrderInternal
{
int ID_IN { get; set; }
int ID_EX { get; set; }
string ProjectNumber{ get; set; }
DateTime OrderDate { get; set; }
}
所以两个列表被传入一个函数,应该完全外部连接它们,基于 NO_Order = ProjectNumber
IList<IOrderInternal> INOrders
IList<IOrderExternal> EXOrders
var leftJoin = from exorder in EXOrders
join inorder in INOrders
on exorder.ProjectNumber equals inorder.NO_Order
into temp
from inorder in temp
select new Order
{
ID_IN = inorder == null ? default(int) : inorder.ID,
ID_EX = exorder.ID,
ProjectNumber = inorder == null ? default(string) : inorder.NO_Order
OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate
};
var rightJoin = from inorderin INOrders
join exorderin EXOrders
on inorder.NO_Order equals exorder.ProjectNumber
into temp
from exorder in temp
select new Order
{
ID_IN = inorder.ID,
ID_EX = exorder == null? default(int) : exorder.ID,
ProjectNumber = inorder.NO_Order
OrderDate = inorder.OrderDate
};
var joinedList = leftJoin.Union(rightJoin);
当我加入列表时,我只得到内部加入的结果。但是我需要知道所有订单的总数。
感谢任何帮助:)
如果我没理解错的话,您想在任一方向进行外部联接,然后将结果连接在一起?这就是我在 linq 中进行左连接的方式:
IList<IOrderInternal> INOrders
IList<IOrderExternal> EXOrders
var leftJoin = from exorder in EXOrders
from inorder in INOrders.Where(x => exorder.ProjectNumber == x.NO_Order).DefaultIfEmpty()
select new Order
{
ID_IN = inorder == null ? default(int) : inorder.ID,
ID_EX = exorder.ID,
ProjectNumber = inorder == null ? default(string) : inorder.NO_Order
OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate
};
var rightJoin = from inorderin INOrders
from exorderin EXOrders.Where(x => inorder.NO_Order == x.ProjectNumber).DefaultIfEmpty()
select new Order
{
ID_IN = inorder.ID,
ID_EX = exorder == null? default(int) : exorder.ID,
ProjectNumber = inorder.NO_Order
OrderDate = inorder.OrderDate
};
var joinedList = leftJoin.Union(rightJoin);
我喜欢这种方式,因为它使左连接全部在一行中,但如果您想继续使用您的语法,我认为您只需将 temp
更改为 temp.DefaultIfEmpty()
每个查询让它工作。