在查询语法中我可以写
var greendoorsWithRooms = from room in house.roooms
from door in room.doors
where door.Color = green
select new {d=door,r=room}
Run Code Online (Sandbox Code Playgroud)
有没有办法用虚线语法实现同样的目的?
var greendoorsWithRooms = house.rooms.SelectMany(room=>room.Doors)
.Where(door=>door.Color==green)
.Select(door=>new{ <room is not in scope> }
Run Code Online (Sandbox Code Playgroud)
我正在教一些非程序员使用LINQPad来对照专有对象模型,这样我们就不必围绕每个奇怪的情况创建GUI.如果他们不必学习查询语法将是有益的.目前,我已经提供了使用foreach解决这个问题的片段,但问题仍然偶尔会出现.
Ger*_*old 43
这也是可能的:
house.rooms.SelectMany(room => room.Doors.Where(door => door.Color == green),
(room, door) => new { r = room, d = door })
Run Code Online (Sandbox Code Playgroud)
这是这个过载SelectMany.
所有LINQ查询都由编译器转换为点分表示法.流利的符号只是语法糖.
在C#语言规范中,在第211页上明确地调出了"从e1中的x1到e2中的x2"的转换.
from x1 in e1 from x2 in e2
Run Code Online (Sandbox Code Playgroud)
变
from * in (e1).SelectMany(x1 => e2, (x1, x2) => new { x1, x2 })
Run Code Online (Sandbox Code Playgroud)
然后按照食谱,你的例子就是
from * in house.rooms.SelectMany(room => room.doors, (room, doors) => new { room, doors })
Run Code Online (Sandbox Code Playgroud)
然后你将通过添加Where和Select子句完成转换为点分表示法.事实上,文档提供SelectMany了您的查询作为示例!
var query =
petOwners
.SelectMany(petOwner => petOwner.Pets,
(petOwner, petName) => new { petOwner, petName })
.Where(ownerAndPet => ownerAndPet.petName.StartsWith("S"))
.Select(ownerAndPet =>
new
{
Owner = ownerAndPet.petOwner.Name,
Pet = ownerAndPet.petName
}
);
Run Code Online (Sandbox Code Playgroud)
您只需将"所有者"更改为"房间",将"宠物"更改为"门"并更改过滤条件.
| 归档时间: |
|
| 查看次数: |
6686 次 |
| 最近记录: |