日期:2014-05-18  浏览次数:21246 次

--------关于LINQ中let的理解--------
刚刚回答了一个帖子,地址:http://topic.csdn.net/u/20120412/14/3ef7786f-f9a9-4c00-86ca-6867439ac77c.html?493,内容如下:
例如:
批号 数量
0001 100
0002 200
0001 300
0002 400
0003 500
在DataTable中显示是这样的结果,现在在DataTable中根据批号分组汇总数量
由于初学Linq,需要多学学。我的写法是这样:
C# code

            DataTable dt = new DataTable();
            dt.Columns.Add("批号", typeof(string));
            dt.Columns.Add("数量", typeof(int));
            DataRow dr1 = dt.NewRow();
            dr1["批号"] = "0001";
            dr1["数量"] = 100;
            dt.Rows.Add(dr1);

            DataRow dr2 = dt.NewRow();
            dr2["批号"] = "0002";
            dr2["数量"] = 200;
            dt.Rows.Add(dr2);

            DataRow dr3 = dt.NewRow();
            dr3["批号"] = "0001";
            dr3["数量"] = 300;
            dt.Rows.Add(dr3);

            DataRow dr4 = dt.NewRow();
            dr4["批号"] = "0002";
            dr4["数量"] = 400;
            dt.Rows.Add(dr4);

            DataRow dr5 = dt.NewRow();
            dr5["批号"] = "0003";
            dr5["数量"] = 500;
            dt.Rows.Add(dr5);
            var sumObject = dt.Compute("Sum(数量)", "");
            var vardt = from p in dt.AsEnumerable()
                        group p by p.ItemArray[0] into g
                        let sum = g.Sum(x => int.Parse(x.ItemArray[1].ToString()))
                        select new
                        {
                            批号 = g.Key,
                            Sum = sum
                        };
            foreach (var outputvar in vardt)
            {
                MessageBox.Show(outputvar.批号 + "  " + outputvar.Sum);
            }


如上代码,比较关键的地方就是 let sum = g.Sum(x => int.Parse(x.ItemArray[1].ToString()))的用法,我现在对let的理解就是对子查询的结果取的一个别名。相当于如下代码(没有分组)
C# code

var qureysum = (from p in dt.AsEnumerable()
                select p.ItemArray[1]).Sum(x => int.Parse(x.ToString()));


不知道理解的对不?请大家看看,说说let的更深层次的理解。谢谢!!!!


------解决方案--------------------
感觉还是帮助中的用词合理一些
创建一个新的范围变量sum ,后面可以对sum 进行操作
------解决方案--------------------
let不就是LINQ中的临时变量吗?为了方便重利用中间结果,提高效率而存在的一个关键字。
------解决方案--------------------
其实let和F#里面的let是一个意思,而Linq的那种函数式写法又和F#完全一样,喜欢函数式编程的人,完全可以去学习F#,这样反过来看Linq,会发现这只不过是F#的冰山一角啊。
------解决方案--------------------
Linq里面的let作用范围只有当前函数本身,封号结束,封号后面的C#代码是不能使用的。
------解决方案--------------------
let 的原理在 C# in depth 3rd 中介绍了,lz有兴趣可以去看看。

简单说说(注意作者强调,这是目前C#实现的方式,但是不是必须的方式)

比如
C# code
var query = from x in db.Users
            let sexstring = x.sex ? "男" : "女"
            select sexstring;

------解决方案--------------------
写一个复杂的给你看看:(当然这么写只是为了演示,没有意义)

C# code
var query = from x in db.Users
            let theage = x.age
            let sexstring = x.sex ? "男" : "女"
            where theage > 30 && sexstring == "男";
            select x;

------解决方案--------------------
来学习一下LINQ,好资源啊!