当前位置:编程学习 > C#/ASP.NET >>

下面的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
--------------------编程问答--------------------
引用 2 楼 q107770540 的回复:
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 --------------------编程问答--------------------
引用 4 楼 q107770540 的回复:
不应该啊。。。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 --------------------编程问答--------------------
引用 4 楼 q107770540 的回复:
不应该啊。。。NET3。5以上都支持的啊:

http://msdn.microsoft.com/en-us/library/bb534297(v=vs.90).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

我找到原因了。。b.Field("id") 要写成b.Field(Of Integer)("id")

还有能解释一下这个么。。
SelectMany(Function(<>h__TransparentIdentifier0) <>h__TransparentIdentifier0.g.DefaultIfEmpty(Of DataRow)()


补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,