2017-03-25 29 views
1

我在Windows 10.1和SQL Sever 2016的Visual Studio 15下工作。我的系统通过将CSV文本文件导入到数据表中然后使用值更新SQL表从数据表中获得。Linq加入数据表到实体框架 - 不评估结果

我试图使用LINQ JOIN声明如下:

  var books = from x in dt.AsEnumerable() 
      join y in db.BookFiles.AsEnumerable() 
      on 
      new {printid = x.Field<string>("PrintID"), packageid = x.Field<string>("PackageID")} 
      equals 
      new {printid = y.PrintId, packageid = y.PackageID} 
      select y; 

      foreach(var book in books) 
      { 
       \\Do Something 
      } 

DT是数据表和数据库是SQL数据库的实体框架表示。我只限于3个测试记录。

当对foreach语句进行评估时,它只是继续评估,直到内存不足。

以下作品的解决方案,所以我不认为这是一个数据问题:

 List<BookFile> books = new List<BookFile>(); 
     foreach (DataRow dr in dt.Rows) 
     { 
      string printid = dr.Field<string>("PrintID"); 
      string packageid = dr.Field<string>("PackageID"); 


      var book = (from data in db.BookFiles 
      where data.PrintId == printid && data.PackageID == packageid 
      select data).Single(); 

      books.Add(book); 
     } 
     foreach(var book in books) 
     { 
      \\Do Something 
     } 

我是否设置正确的加入?我已经尝试使用数据库,然后在连接中的数据表。我已经尝试对连接的字段使用定义的类。任何信息都有帮助。

+0

'AsEnumerable()'在这里调用'db.BookFiles.AsEnumerable()'导致'BookFiles'表被完全加载到内存中。对于这样的场景,你最好使用第二种方法。 –

回答

0

删除AsEnumerable()(它会将所有表加载到内存中,在连接之前不需要使用它),并将ToList()(在那一刻会有真正的数据库查询)添加到foreach中的书中,像这样

var books = from x in dt 
         join y in db.BookFiles 
         on 
         new { printid = x.Field<string>("PrintID"), packageid = x.Field<string>("PackageID") } 
         equals 
         new { printid = y.PrintId, packageid = y.PackageID } 
         select y; 

      foreach (var book in books.ToList()) 
      { 
       \\Do Something 
      } 
+0

当我尝试使用System.Data.Datable dt没有可观的Visual Studio将产生“找不到源类型的查询模式'DataTable的实现''加入'未找到” 如果我使用dt .AsEnumerable和没有.AsEnumerable的db.Bookfiles我得到相同的结果。 dt只包含3行,所以它不应该是内存泄漏。 –