1

我是 C# 和 LINQ 的新手,但后者非常酷。除了我无法弄清楚这里发生了什么:

我有以下代码,它按预期运行;它排序并选择前 100 条记录:

IEnumerable<workerLog> query =
    (from record in _gzClasses.workerLogs                
    orderby record.workerID, record.timeStamp ascending                
    select record).Take(100);

foreach(var record in query)
{
    Console.WriteLine(record.timeInSession.ToString());
}

但是当我执行以下操作时,会打印相同的行,但是程序会挂起一点,并抛出 SQLException 说服务器超时。

IEnumerable<workerLog> query =
    from record in _gzClasses.workerLogs                
    orderby record.workerID, record.timeStamp ascending                
    select record;

foreach(var record in query.Take(100))
{
    Console.WriteLine(record.timeInSession.ToString());
}

这里有什么不同?它与执行 LINQ 查询的方式有关吗?来自 Java 世界,这没有任何意义。

4

1 回答 1

3

这是错误:

IEnumerable<workerLog> query =

通过强制它IEnumerable<WorkerLog>,您破坏了“组合”,这意味着 SQL 服务器认为您已经请求了所有数据,并且在接收方您将选择只关心前 100 行。如果您IQueryable<WorkerLog>改为使用(或仅使用var),则它可以将 Take(100) “组合”到 SQL 中并发出:

select top 100 ...

请注意,在第一个示例中,您只能在它组成IEnumerable<WorkerLog> 之后强制它,这样就可以了.... ish。

基本上,IQueryable<T>是可组合的 API,可以从多个操作中生成有趣的 TSQL。IEnumerable<T>是 LINQ-to-Objects,它在 c# 中而不是在 SQL 中进行过滤 / 等。

于 2012-08-02T22:21:08.483 回答