下面的linq求vb些写法
static void Main(string[] args)
{
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<int>("id") equals b.Field<int>("id") into g
from b in g.DefaultIfEmpty()
select new
{
id = a.Field<int>("id"),
price = a.Field<string>("price"),
price_excel = b == null ? "Null" : b.Field<string>("price")
};
var rightData = from b in dtB.AsEnumerable()
where !dtA.AsEnumerable().Select(a => a.Field<int>("id")).Contains(b.Field<int>("id"))
select new
{
id = b.Field<int>("id"),
price = "Null",
price_excel = b.Field<string>("price")
};
var fullJoinData = leftData.Union(rightData);
fullJoinData.ToList().ForEach(q => dtC.Rows.Add(q.id, q.price, q.price_excel));
Console.ReadLine();
}
主要是
on a.Field<int>("id") equals b.Field<int>("id") into g 这句 ,into g ,怎么都出错啊~
linq vb --------------------编程问答-------------------- 来人啊~ --------------------编程问答--------------------
Private Shared Sub Main(args As String())--------------------编程问答--------------------
Dim dtA As DataTable = New DataTable()
dtA.Columns.Add("id", GetType(Integer))
dtA.Columns.Add("price", GetType(String))
dtA.Rows.Add(New Object()() = { 1, "100" })
dtA.Rows.Add(New Object()() = { 2, "100" })
Dim dtB As DataTable = dtA.Clone()
dtB.Rows.Add(New Object()() = { 1, "100" })
dtB.Rows.Add(New Object()() = { 3, "100" })
Dim dtC As DataTable = dtA.Clone()
dtC.Columns.Add("price_excel")
Dim leftData As var = dtA.AsEnumerable().GroupJoin(dtB.AsEnumerable(), Function(a As DataRow) a.Field("id"), Function(b As DataRow) b.Field("id"), Function(a As DataRow, g As IEnumerable(Of DataRow)) New With{ a, g }).SelectMany(Function(<>h__TransparentIdentifier0) <>h__TransparentIdentifier0.g.DefaultIfEmpty(Of DataRow)(), Function(<>h__TransparentIdentifier0, b As DataRow) New With{ Key .id = <>h__TransparentIdentifier0.a.Field("id"), Key .price = <>h__TransparentIdentifier0.a.Field("price"), Key .price_excel = If((b Is Nothing), "Null", b.Field("price")) })
Dim rightData As var = dtB.AsEnumerable().Where(Function(b As DataRow) Not dtA.AsEnumerable().[Select](Function(a As DataRow) a.Field("id")).Contains(b.Field("id"))).[Select](Function(b As DataRow) New With{ Key .id = b.Field("id"), Key .price = "Null", Key .price_excel = b.Field("price") })
Dim fullJoinData As var = leftData.Union(rightData)
fullJoinData.ToList().ForEach(Sub(q)
dtC.Rows.Add(New Object()() = { q.id, q.price, q.price_excel })
End Sub)
Console.ReadLine()
End Sub
你确定能执行吗~
dtA.AsEnumerable().GroupJoin(...). 这里报错,我点不出东西来~~ --------------------编程问答-------------------- 不应该啊。。。NET3。5以上都支持的啊:
http://msdn.microsoft.com/en-us/library/bb534297(v=vs.90).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 --------------------编程问答--------------------
是3.5的,我用的vs2008
就说这个
Dim leftData As var 也不行吧
。。
dtA.AsEnumerable().GroupJoin(...).这里点不出SelectMany --------------------编程问答--------------------
我找到原因了。。b.Field("id") 要写成b.Field(Of Integer)("id")
还有能解释一下这个么。。
SelectMany(Function(<>h__TransparentIdentifier0) <>h__TransparentIdentifier0.g.DefaultIfEmpty(Of DataRow)()
补充:.NET技术 , LINQ