Wah*_*eed 2 c# linq lambda linq-to-sql
我有遵循LINQ to SQL查询表达式
from msg in TblUserMessages
join user in Aspnet_Users on msg.FromUserID equals user.UserId
select new {
msg.FromUserID,
msg.ToUserID,
msg.MessageLocationID,
msg.MessageID,
user.UserName
}
Run Code Online (Sandbox Code Playgroud)
并遵循LINQ方法表达式:
TblUserMessages
.Join (
Aspnet_Users,
msg => msg.FromUserID,
user => user.UserId,
(msg, user) =>
new
{
FromUserID = msg.FromUserID,
ToUserID = msg.ToUserID,
MessageLocationID = msg.MessageLocationID,
MessageID = msg.MessageID,
UserName = user.UserName
}
)
Run Code Online (Sandbox Code Playgroud)
这两个都返回相同的结果集.这是例如:
82522f05-2650-466a-a430-72e6c9fb68b7
6b2a174a-8141-43d2-b3ad-5b199bcbfcae
1
1
waheed
Run Code Online (Sandbox Code Playgroud)
哪一个更好用.在FIRST一个或SECOND一个.
谢谢
Jon*_*eet 12
它们是等价的.它们不仅返回相同的结果集 - 它们编译为相同的代码.
根据可读性,对个别情况使用查询表达式或点表示法.对于连接,我发现点符号非常麻烦 - 但我用它只有一个或两个子句(通常在/ select)的情况.即使有两个子句(通常在哪里和选择),如果你还需要使用它,我会发现点符号很好.例如,我喜欢:
var query = people.Where(person => person.Age > 18)
.Select(person => person.Name)
.Skip(100)
.Take(10);
Run Code Online (Sandbox Code Playgroud)
过度
var query = (from person in people
where person.Age > 18
select person.Name)
.Skip(100)
.Take(10);
Run Code Online (Sandbox Code Playgroud)
对于更复杂的查询(例如连接),我可能只是将两者分开:
var baseQuery = from person in people
where person.Age > 18
join company on person.CompanyId equals company.CompanyId
select new { person.Name, company.Name };
var fullQuery = baseQuery.Skip(100)
.Take(10);
Run Code Online (Sandbox Code Playgroud)
我发现这种分离使它更容易阅读.
我认为开发人员至少可以理解查询表达式的基本知识是非常有用的 - 事实上它们基本上是转换为点表示法,而且语言本身对LINQ to Objects,LINQ to SQL等一无所知. ; 这只是遵循适当模式的情况.这是一个很好的设计,这意味着查询表达式只影响语言规范的一小部分.
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |