LINQ full out joinが実現しました。
今日CSDNであるネット友達の質問を見ました。
例えば、dt 1データは、id price 1 100 2 dt 2 idエクセル1 100 3 200です。
欲しいデータは、id price excleprice 1 100 2 null 3 null 100です。
どうやって実現しますか
まず思いつく実現方法は、
その後、より明確な筋道の実現方法を書きました。
元の問題住所:http://topic.csdn.net/u/20120221/10/6e7691f8-00bf-44a1-9e52-90bad0bbc416.html?seed=93059827&r=77628090#r_77628090
例えば、dt 1データは、id price 1 100 2 dt 2 idエクセル1 100 3 200です。
欲しいデータは、id price excleprice 1 100 2 null 3 null 100です。
どうやって実現しますか
まず思いつく実現方法は、
void Main()
{
DataTable dtA = new DataTable();
dtA.Columns.Add("id", typeof(int));
dtA.Columns.Add("price", typeof(string));
dtA.Rows.Add(1, "100");
dtA.Rows.Add(2, "100");
DataTable dtB = dtA.Clone();
dtB.Rows.Add(1, "100");
dtB.Rows.Add(3, "100");
DataTable dtC = dtA.Clone();
dtC.Columns.Add("price_excel");
var fullJoinData =(from a in dtA.AsEnumerable()
join b in dtB.AsEnumerable()
on a.Field("id") equals b.Field("id") into g
from b in g.DefaultIfEmpty()
select new
{
id = a.Field("id"),
price = a.Field("price"),
price_excel = b == null ? "Null" : b.Field("price")
}).Union
(
from b in dtB.AsEnumerable()
join a in dtA.AsEnumerable()
on b.Field("id") equals a.Field("id") into g
from a in g.DefaultIfEmpty()
select new
{
id = b.Field("id"),
price = a == null ? "Null" : a.Field("price"),
price_excel =b.Field("price")
}
);
fullJoinData.ToList().ForEach(q => dtC.Rows.Add(q.id, q.price, q.price_excel));
}
その後、より明確な筋道の実現方法を書きました。
void Main()
{
DataTable dtA = new DataTable();
dtA.Columns.Add("id", typeof(int));
dtA.Columns.Add("price", typeof(string));
dtA.Rows.Add(1, "100");
dtA.Rows.Add(2, "100");
DataTable dtB = dtA.Clone();
dtB.Rows.Add(1, "100");
dtB.Rows.Add(3, "100");
DataTable dtC = dtA.Clone();
dtC.Columns.Add("price_excel");
var leftData=from a in dtA.AsEnumerable()
join b in dtB.AsEnumerable()
on a.Field("id") equals b.Field("id") into g
from b in g.DefaultIfEmpty()
select new
{
id = a.Field("id"),
price = a.Field("price"),
price_excel = b == null ? "Null" : b.Field("price")
};
var rightData=from b in dtB.AsEnumerable()
where !dtA.AsEnumerable().Select(a=>a.Field("id")).Contains(b.Field("id"))
select new
{
id = b.Field("id"),
price = "Null",
price_excel =b.Field("price")
};
var fullJoinData =leftData.Union(rightData);
fullJoinData.ToList().ForEach(q => dtC.Rows.Add(q.id, q.price, q.price_excel));
}
元の問題住所:http://topic.csdn.net/u/20120221/10/6e7691f8-00bf-44a1-9e52-90bad0bbc416.html?seed=93059827&r=77628090#r_77628090