首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

-关于LINQ中let的理解-解决办法

2012-04-15 
--------关于LINQ中let的理解--------刚刚回答了一个帖子,地址:http://topic.csdn.net/u/20120412/14/3ef7

--------关于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,好资源啊!

热点排行