代码之家  ›  专栏  ›  技术社区  ›  mattmc3

你能用Linq to SQL得到像流媒体一样的数据读取器吗?

  •  4
  • mattmc3  · 技术社区  · 14 年前

    下面是一个代码示例:

    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...
       }
    }
    

    一旦我开始遍历数据,查询就会按预期执行。当单步执行代码时,我立即进入循环,这正是我所希望的——这意味着L2似乎在幕后使用数据读取器,而不是首先提取所有数据。但是,一旦我到了 break ,查询将继续运行并提取所有其他记录。以下是我向SO社区提出的问题:

    1.)有没有一种方法可以像使用 DataReader ?

    数据读取器

    如果这不是 DataContext 并且需要通过一些定制来扩展功能。我只是想利用Linq的简单性和强大功能来进行夜间处理任务的大型查询,而不是依赖T-SQL来完成所有任务。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Ahmad Mageed    14 年前

    1.)是否有方法阻止Linq to 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 to SQL查询,是否有方法防止 更改每个的跟踪信息

    如果特定查询的目的是将其用于只读目的,则可以通过设置 DataContext.ObjectTrackingEnabled property 错误:

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

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