2010-10-21 30 views
4

我一直在使用Linq-to-SQL一段时间,它工作的很好。但是,最近我一直在尝试使用它来获取大量的数据,并且遇到了一些问题。 (当然,我明白,L2S可能不是这种特殊处理的合适的工具,但是这就是为什么我在尝试 - 找到它的极限。)您是否可以使用Linq-to-SQL获得类似DataReader的流式传输?

下面是一个代码示例:

var buf = new StringBuilder(); 
var dc = new DataContext(AppSettings.ConnectionString); 
var records = from a in dc.GetTable<MyReallyBigTable>() where a.State == "OH" select a; 
var i = 0; 
foreach (var record in records) { 
    buf.AppendLine(record.ID.ToString()); 
    i += 1; 
    if (i > 3) { 
     break; // Takes forever... 
    } 
} 

一旦我开始迭代数据,查询就会按预期执行。在单步执行代码时,我立即进入了这个循环,这正是我所希望的 - 这意味着L2S似乎在后台使用DataReader,而不是首先提取所有数据。但是,一旦我到达break,查询将继续运行并将所有其余记录拉出。以下是我对SO社区的问题:

1.)有没有办法阻止Linq-to-SQL在DataReader的中途停止执行真正的大查询?

2.)如果你执行一个大的Linq-to-SQL查询,是否有办法阻止DataContext填充每个返回对象的变更跟踪信息。基本上,我可以使用DataReader技术做一个很短的对象生命周期查询,而不是填充内存吗?

我很好,如果这不是DataContext本身的功能,并且需要通过一些定制扩展功能。我只是希望利用Linq的简单性和强大功能来处理夜间处理任务的大型查询,而不是依赖于T-SQL处理所有事情。

回答

7

1)是否有办法从中间整理一个真正 大的查询执行你 可以使用DataReader的方式停止LINQ到SQL?

不完全。一旦查询被最终执行,底层SQL语句就返回匹配记录的结果集。查询被推迟到那一点,但不在遍历期间。

对于您的示例,您可以简单地使用records.Take(3),但我理解您停止此过程的实际逻辑可能在SQL外部或不易翻译。

您可以通过构建强类型LINQ查询然后使用旧式ADO.NET执行该查询来使用组合方法。缺点是你失去了映射到类,不得不手动处理SqlDataReader结果。这方面的一个例子如下所示:

var query = from c in Customers 
      where c.ID < 15 
      select c; 

using (var command = dc.GetCommand(query)) 
{ 
    command.Connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
     int i = 0; 
     while (reader.Read()) 
     { 
      Customer c = new Customer(); 
      c.ID = reader.GetInt32(reader.GetOrdinal("ID")); 
      c.Name = reader.GetString(reader.GetOrdinal("Name")); 
      Console.WriteLine("{0}: {1}", c.ID, c.Name); 
      i++; 
      if (i > 3) 
       break; 
     } 
    } 
} 

2)如果你执行一个大型的LINQ到SQL查询,有没有办法阻止 的DataContext从 变化的跟踪信息填充每返回一个对象 。

如果您打算为特定的查询使用它的只读目的,那么你可以禁用目标跟踪通过设置DataContext.ObjectTrackingEnabled property为false,以提高性能:

using (var dc = new MyDataContext()) 
{ 
    dc.ObjectTrackingEnabled = false; 
    // do stuff 
} 

您还可以阅读MSDN主题:How to: Retrieve Information As Read-Only (LINQ to SQL)

相关问题