我遵循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
}
遵循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
}
)
这两个都返回相同的结果集。这是例如:
82522f05-2650-466a-a430-72e6c9fb68b7
6b2a174a-8141-43d2-b3ad-5b199bcbfcae
1
1
waheed
哪一个更好用。 FIRST
个或SECOND
个。
由于
答案 0 :(得分:12)
它们是等价的。它们不仅返回相同的结果集 - 它们编译为相同的代码。
根据可读性,对个别情况使用查询表达式或点表示法。对于连接,我发现点符号非常麻烦 - 但我用它只有一个或两个子句(通常在/ select)的情况。即使有两个子句(通常在和选择的地方),如果你还需要使用它,我会发现点符号很好。例如,我喜欢:
var query = people.Where(person => person.Age > 18)
.Select(person => person.Name)
.Skip(100)
.Take(10);
在
var query = (from person in people
where person.Age > 18
select person.Name)
.Skip(100)
.Take(10);
对于更复杂的查询(例如联接),我可能只是将两者分开:
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);
我发现这种分离使其更容易阅读。
我相信开发人员至少可以理解查询表达式的基本知识是非常有用的 - 事实上它们基本上是转换为点表示法,并且语言本身对LINQ to Objects,LINQ一无所知到SQL等;这只是遵循适当模式的情况。这是一个很好的设计,这意味着查询表达式只会影响语言规范的一小部分。
答案 1 :(得分:3)
没有更好的。用你喜欢的。在这种情况下,我会使用'query'语法,因为我认为它比第二个更可读。此外,既然我们正在编写SQL,我认为这种语法更适合它。但我相信其他人会不同意并倾向于选择lamda版本。
我通常使用后一种语法btw,因为我更喜欢lambda语法,因为它通常更具可读性和更短。
答案 2 :(得分:2)
我总是选择更具可读性的选项,在这种情况下,我认为它是LINQ片段。
答案 3 :(得分:2)
两者都表现同样出色,但我更喜欢第一部,因为它更容易阅读和理解。
答案 4 :(得分:1)
无论你发现哪个更容易阅读。
答案 5 :(得分:1)
“编写代码,然后测量它以找出要重构的内容。”你有两个衡量标准吗? 更好是主观的。
你是否发现任何一个问题让你想要选择一个而不是另一个?
答案 6 :(得分:0)
这两种语法之间有一点差别。查询表达式将使用更长进行编译,因为编译器必须将其转换为点语法。当然,它几乎完全无关紧要,因为:
答案 7 :(得分:0)
当我必须动态构建查询时,我使用Lambda表达式;当查询完全已知时,我使用LINQ to SQL。
IQueryable<IncomeDetailsEntity> query;
if (!string.IsNullOrEmpty(regioncode))
{
if (!string.IsNullOrEmpty(compcode))
{
query = db.IncomeDetailsEntities.Where(i => i.RegionCode == regioncode && i.CompanyCode == compcode);
}
else
{
query = db.IncomeDetailsEntities.Where(i => i.RegionCode == regioncode);
}
}
else
{
query = db.IncomeDetailsEntities;
}
return query.Select(i => new { i.RegionCode, i.Budget });