我有这两行代码,它们的功能完全相同。但是它们的写法不同。哪种写法更好,为什么呢?
firstRecordDate = (DateTime)(from g in context.Datas
select g.Time).Min();
firstRecordDate = (DateTime)context.Datas.Min(x => x.Time);
http://msdn.microsoft.com/en-us/library/bb397947.aspx
这里也可以看看: .NET LINQ查询语法 vs 方法链
关键在于你所熟悉的和你认为更易读的方式。
我认为应该选择对开发团队最易读或易懂的方式。过一年再回来看看,你是否还记得那个LINQ…好吧,这个特定的LINQ显然很简单,所以这是无关紧要的 :-)
最佳实践也有很多不同的意见,你在这里不可能得到一个答案。在这种情况下,我会选择第二个选项,因为它简洁,并且我个人可以比第一个更快地阅读和理解,尽管只是略微更快。
我个人更喜欢使用lambda表达式。据我所知,实际上并没有什么区别,就像你说的,两种方法都可以做到完全相同的事情。我们都同意使用lambda,因为它易于阅读、遵循,并且对不喜欢SQL的人来说容易掌握。
假设您确实在每种格式中编写等效语句,则结果方面绝对没有任何区别。
针对任何给定查询,选择最易读的格式。具有连接和许多where子句等复杂查询通常更容易在linq查询语法中编写/阅读,但像context.Employees.SingleOrDefault(e => e.Id == empId)
这样的简单查询使用方法链接语法更容易。没有普遍的“一个更好”的规则,对于任何给定的示例,两个人可能有不同的意见。
这两个语句在语义上没有区别。选择哪一个纯粹是风格偏好的问题。
你们两个都需要显式转换吗?时间不是已经是DateTime了吗?
个人而言,我更喜欢第二种方法,因为我觉得扩展方法语法比LINQ语法更熟悉,但这只是个人偏好,它们的执行效果相同。
如果要让第二种写法看起来更像第一种,可以写成context.Datas.Select(x => x.Time).Min()
。所以你可以看到,用Min(x => x.Time)
的方式写会稍微更有效率,因为你只需要一个操作而不是两个。
查询理解语法实际上被编译成一系列对扩展方法的调用,这意味着这两种语法在语义上是相同的。无论你喜欢哪种风格,都应该使用它。