C# 在实体框架中仅检索表中的第一行
背景: 实体框架4,使用SQL Server 2008 问题: 我有一张桌子C# 在实体框架中仅检索表中的第一行,c#,sql-server-2008,entity-framework,select,C#,Sql Server 2008,Entity Framework,Select,背景: 实体框架4,使用SQL Server 2008 问题: 我有一张桌子订单。每行有一列时间戳 用户可以选择过去的某个时间,我需要获取最接近指定时间的顺序,但这是在指定时间之前发生的。换句话说,在指定时间之前的最后一个订单 例如,如果我有订单 2008-01-12 2009-04-17 2009-09-24 2010-11-02 2010-12-01 2011-05-16 然后选择一个日期,我应该得到2009-09-24订单,因为这是指定日期之前的最后一个订单 var query = (f
订单
。每行有一列时间戳
用户可以选择过去的某个时间,我需要获取最接近指定时间的顺序
,但这是在指定时间之前发生的。换句话说,在指定时间之前的最后一个订单
例如,如果我有订单
2008-01-12
2009-04-17
2009-09-24
2010-11-02
2010-12-01
2011-05-16
然后选择一个日期,我应该得到2009-09-24订单,因为这是指定日期之前的最后一个订单
var query = (from oData in db.OrderDatas
where oData.Timestamp <= userTime
orderby oData.Timestamp ascending
select oData).Last();
var query=(来自db.OrderDatas中的oData
其中oData.Timestamp一般来说,如果您关心LINQ的行为,那么应该检查SQL到底发生了什么。如果您还没有弄清楚如何将LINQ查询转换为SQL,那么接下来应该做的就是这样
正如您在评论中所指出的,EF可能也是如此。幸运的是,使用First()
很容易:
var query = (from oData in db.OrderDatas
where oData.Timestamp <= userTime
orderby oData.Timestamp descending
select oData).First();
var query=(来自db.OrderDatas中的oData
其中oData.Timestamp问题:
此查询是否会获取所有数据(早于userTime),然后
最后一个元素,或者将其转换为只有一个元素
将从数据库返回?我的表可以容纳很大的数据
行数(100000+),因此性能是这里的一个问题
在本例中,使用first()方法,将立即执行查询,并对其进行优化,使其仅检索1条记录选择。您确实需要使用sql profilihg工具或使用datacontext的日志来检查生成的sql。或者您可以使用linqpad。如果使用方式不正确,linq-2-sql可能会导致N+1查询。这种行为是可以预测的,但一开始您确实必须注意。尝试使用:
var query = (from oData in db.OrderDatas
where oData.Timestamp <= userTime
orderby oData.Timestamp descending
select oData).Take(1);
var query=(来自db.OrderDatas中的oData
我刚刚检查的oData.Timestamp的位置。不支持最后一个运算符。所以我想我会坚持使用降序/第一个组合。@KornelijePetak:这肯定是一个决定性因素-将相应地编辑我的帖子。@KornelijePetak:请注意,该链接用于LINQ到SQL,而不是EF。它可能与EF一起工作。可能值得尝试和检查我知道如何在LINQ2SQL中检查生成的SQL(使用.Log),我知道如何检查ObjectQuery的CommandText,但在这种情况下这对我没有多大帮助,因为,when.First()运算符被应用,我不再有ObjectQuery,而是单一的TSource。我如何读取实际执行的生成的SQL语句?@KornelijePetak:我不知道,但在分析器中观察查询肯定是一种方法。我不确定在解析L时LINQ2SQL和EF4在幕后有多大的不同INQ查询,但我的问题涉及EF,以及您对LINQ2SQL的回答。对不起,我的错误。它仍然具有相当的可比性。如果您使用探查器(无论是从SQL Server还是使用Express Anj探查器),您仍然可以看到结果。我相信EF中也会有一个优化的select top(1),而不是整个集合。