linq,问Tim和懂的人,顶者有分!!!!

symbol_bc 2010-11-02 05:02:15
今天看这个帖子
http://topic.csdn.net/u/20101025/18/3f583705-38f8-4abe-b778-9faa6cc52bee.html
发现fangxinggood的写法不是很懂,代码入下

static void Main(string[] args)
{
var list = GetData();

var query =
from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key
from u2 in g
where u2.Date == g.Min(u3 => u3.Date)
select u2;

foreach (var u in query)
Console.WriteLine("{0}, {1}, {2}", u.UserId, u.Date, u.Rank);


Console.Read();
}

static IEnumerable<User> GetData()
{
yield return new User { UserId = "100", Rank = "10", Date = "20101012", IsNormal = "1" };
yield return new User { UserId = "100", Rank = "20", Date = "20101009", IsNormal = "1" };
yield return new User { UserId = "200", Rank = "11", Date = "20101011", IsNormal = "1" };
yield return new User { UserId = "100", Rank = "18", Date = "20101008", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "2", Date = "20101010", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "15", Date = "20101013", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "16", Date = "20101002", IsNormal = "0" };
}





其中这里
var query =
from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key
from u2 in g
where u2.Date == g.Min(u3 => u3.Date)
select u2;

list通过userid分组后并入g,下面u2应该是g的分组成员,怎么能得到Date这个属性呢?
我分开写的话,这样
var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key select g;

var w = from u2 in q
where u2.Date == q.Min(u3 => u3.Date)
select u2;
根本就不行。请问这是怎么回事。
这是一。
第二:有多个from这种情况
比如var g = from u in list
from u1 in list
select u;
我查看结果,他们似乎做的是笛卡尔积,不太好用,实际中怎么用呢?
第三:如果我是linq to entities这种情况,我怎么查看当前linq对应的sql呢?还是根本看不了?!

赶快来人!!
...全文
242 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
vpoint2009 2010-11-03
  • 打赏
  • 举报
回复
linq for xml还有点戏for sql就算了吧...
机器人 2010-11-03
  • 打赏
  • 举报
回复
厉害。。。各位分析的。。。

只是Linq通过上下文分析,所作之事真是强大。

兔子-顾问 2010-11-03
  • 打赏
  • 举报
回复
期待tim申请linq版主。看来你的粉丝已经准备好投你票了。
symbol_bc 2010-11-03
  • 打赏
  • 举报
回复
谢谢Tim,结贴!
bloodish 2010-11-03
  • 打赏
  • 举报
回复
连起来写的时候,你没有做select g, 这时候g是IGrouping<...,...>
分开写,你做了select g,这时候返回的就是一个IOrderedEnumerable<IGrouping<...,...>>

select导致了不同的结果集和类型,想一下就明白了.
q107770540 2010-11-03
  • 打赏
  • 举报
回复

void Main()
{

var list = GetData();

var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key select g;

//你看看这样写 是不是好理解一点
var w = from u2 in q
from u3 in u2
where u3.Date == u2.Min(u =>u.Date)
select u3;


w.ToList().ForEach(u=>Console.WriteLine(u.UserId));

/*
100
200
300
*/
}

caotoulei 2010-11-03
  • 打赏
  • 举报
回复
lz,是时候Fluent一下了呵呵。
symbol_bc 2010-11-02
  • 打赏
  • 举报
回复
哇!逍遥的方法也很霸道啊!
还可以这么写
var w = from g in q
from u2 in g
where u2.Date == g.Min(u3 => u3.Date)
select u2;

明天等Tim来再结贴,上次问他问题他没赶上,谢谢“淡泊”。
shoy160 2010-11-02
  • 打赏
  • 举报
回复
连着写是单个组,
分开就成了一个集合了,所以不能对它直接进行操作。
claymore1114 2010-11-02
  • 打赏
  • 举报
回复
q是g的集合
symbol_bc 2010-11-02
  • 打赏
  • 举报
回复
有点懂了,我以为
var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key select g;
里面的g和查询的结果q是一个东西!原来不是!对吧!!!

我想想!
claymore1114 2010-11-02
  • 打赏
  • 举报
回复

var w = from u2 in q where u2.Date == q.Min(u3 => u3.Date) select u2;
//u2 是单个组,q是多个组,u3是单个组,u3里头(key+user集合),u3相当于前面的g,
兔子-顾问 2010-11-02
  • 打赏
  • 举报
回复
大概看了一下。
var query = from u in list
where u.IsNormal == "1"
group u by u.UserId into g//这里g是IGrouping类型的
orderby g.Key
from u2 in g
where u2.Date == g.Min(u3 => u3.Date)
select u2;

var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key
select g;//这里g也是IGrouping类型的
但是from...select返回的就是g类型的IOrderedEnumerable<IGrouping<string,User>>类型了。
相当于你需要再次from才能达到效果,例如你的修改为
var w = from g in q
from u2 in g
where u2.Date == g.Min(u3 => u3.Date)
select u2;
才行。

不太懂Linq。你继续等Garfield(Tim)吧。
claymore1114 2010-11-02
  • 打赏
  • 举报
回复
1、

//原来的
1)from u2 in g where u2.Date == g.Min(u3 => u3.Date)

//你的
2)from u2 in q where u2.Date == q.Min(u3 => u3.Date)

//不一样吧 1中的g是 单个组(key+User集合) 2中的 q 是g的集合(多个组)

2、多个from,是笛卡尔积,跟sql一样用
3、有专门的工具,也可以写到日志里。
claymore1114 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 symbol_bc 的回复:]

引用 16 楼 claymore1114 的回复:
你分开来当然不行了。

C# code

var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key select g;
//这里的g 是指单个组,一个组里面包含了一个key和一个User集合 当然能
//g.……
[/Quote]
g是指单个组,一个组里面包含了一个key和一个User集合,当然可以g.Min(u3 => u3.Date) //u3就是User集合的单个User
symbol_bc 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 claymore1114 的回复:]
你分开来当然不行了。

C# code

var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key select g;
//这里的g 是指单个组,一个组里面包含了一个key和一个User集合 当然能
//g.Min(u3 => u3.Date)
/……
[/Quote]

可是放到一起写的时候就行啊,难道放到一起写的时候group u by u.UserId into g
这个g就不是你说的
//这里的g 是指单个组,一个组里面包含了一个key和一个User集
兔子-顾问 2010-11-02
  • 打赏
  • 举报
回复
标记一下。回头来欣赏。
devin_jia 2010-11-02
  • 打赏
  • 举报
回复
顶 。。。
symbol_bc 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 q107770540 的回复:]
先说到 真得走了

你先想一想
[/Quote]


好!!我想想!
claymore1114 2010-11-02
  • 打赏
  • 举报
回复
你分开来当然不行了。

var q = from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key select g;
//这里的g 是指单个组,一个组里面包含了一个key和一个User集合 当然能
//g.Min(u3 => u3.Date)
// q是一个select出组成g的集合
加载更多回复(15)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧