Linq将数据表连接到实体框架 - 不评估结果

时间:2017-03-25 11:00:22

标签: c# sql entity-framework linq join

我在Windows 10.1和SQL Sever 2016中的Visual Studio 15下工作。我的系统通过将CSV文本文件导入数据表来处理CSV文本文件,然后使用从数据表中获取的值更新SQL表。

我正在尝试使用LINQ JOIN语句,如下所示:

int b = 222;
int *p = new int(111);

int& refb = b;  // evaluated to the storage of b;
int& refp = *p; // evaluated to the storage in dynamic memory, pointed by p;
int& illegal = 2; // ERROR: not a lvalue;

dt是数据表,db是SQL数据库的实体框架表示。我将dt限制为只有3条记录进行测试。

当评估foreach语句时,它会继续进行评估,直到内存不足为止。

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

            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
            }

我是否错误地设置了JOIN?我先尝试使用db,然后再使用连接中的数据表。我已经尝试为已连接的字段使用已定义的类。任何信息都会有所帮助。

1 个答案:

答案 0 :(得分:0)

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

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
            }