Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中仅检索表中的第一行_C#_Sql Server 2008_Entity Framework_Select - Fatal编程技术网

C# 在实体框架中仅检索表中的第一行

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

背景:

实体框架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 = (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),而不是整个集合。