来自 SqlBulkCopy 的 LINQ 查询的数据读取器

Posted

技术标签:

【中文标题】来自 SqlBulkCopy 的 LINQ 查询的数据读取器【英文标题】:Datareader from LINQ Query for SqlBulkCopy 【发布时间】:2013-06-24 07:36:05 【问题描述】:

我正在使用这个库:

Link to EntityDataReader

将来自 xml 解析的一些 linq 查询结果放入带有 sqlbulkcopy 的数据库中,该数据库使用数据读取器直接放入数据,而无需使用数据表或此类数据结构。

我无法实现它。

这是我到目前为止写的没有成功的代码:

XDocument xdoc = XDocument.Parse(str_XmlToParse);

            //ORDINI

            IEnumerable<XDocument> xdod;

            var orders = from c in xdoc.Descendants("ordersdata").AsEnumerable().Descendants("order").AsEnumerable()
                         select new
                         
                             Client_ID = (string)c.Element("Client").Element("ID"),
                             Doc_ID = (string)c.Element("ord_ID"),
                             Doc_data = (DateTime)c.Element("ord_datetime"),
                         ;
      IDataReader dr = orders.AsDataReader();

            using (SqlConnection con = new SqlConnection(connectionString))
            
                con.Open();
                using (SqlTransaction tran = con.BeginTransaction())
                
                    var newOrders =
                            from i in Enumerable.Range(0, totalToSend)
                            select new Order
                            
                                customer_name = "Customer " + i % 100,
                                quantity = i % 9,
                                order_id = i,
                                order_entry_date = DateTime.Now
                            ;

                    SqlBulkCopy bc = new SqlBulkCopy(con,
                      SqlBulkCopyOptions.CheckConstraints |
                      SqlBulkCopyOptions.FireTriggers |
                      SqlBulkCopyOptions.KeepNulls, tran);

                    bc.BatchSize = 1000;
                    bc.DestinationTableName = "order_queue";
                    bc.WriteToServer(newOrders.AsDataReader());

                    tran.Commit();
                
                con.Close();

这主要是该库示例中内容的副本。

我什至没有正确理解他们所有奇怪的演员阵容发生了什么,但我需要它来工作。 (相信我,我试图理解)

我不断收到此错误:

错误 1 ​​'System.Collections.Generic.IEnumerable AnonymousType#1>' 确实 不包含“AsDataReader”的定义,也没有扩展方法 'AsDataReader' 接受类型的第一个参数 'System.Collections.Generic.IEnumerable AnonymousType#1>' 可能是 找到(您是否缺少 using 指令或程序集引用?)

这是什么?我该如何解决?

谢谢

【问题讨论】:

附言。我认为这是编译器错误而不是异常。对吗? 您好。我很想得到这个图书馆。我点击了链接,但它已被淘汰。谁知道哪里可以下载? @serlingpa 也许为时已晚,但是.... code.msdn.microsoft.com/windowsdesktop/WPF-783fc64b/… 截至 2020 年,GitHub 上仍有一个版本可用:Repository/Repository.EntityFramework/EntityDataReader.cs,由 Matthew Schrager 在微软退休后维护。 【参考方案1】:

好吧,基本上错误说您不能应用带有参数“IEnumerable”对象的方法“AsDataReader”,因为没有这样的方法具有此定义。如果可能有帮助,请尝试在引用中添加 DLL "System.Data.Entity" 和 System.Data.EntityClient

【讨论】:

试过了,但我没想到它会起作用。这只是从匿名类型到 Ienumerable 列表或其他东西的错误转换问题。 “订单”变量是什么类型的?因为我猜,您的 LINQ 查询的结果不会返回您可以应用“AsDataReader()”方法的内容。顺便说一句:你为​​什么放 2 ".AsEnumerable()" ?我想你只需要一个 刚刚查看了您添加的示例。您需要在顶部使用using Microsoft.Samples.EntityDataReader(除非您已将源更改为EntityDataReader.cs 文件)。原因是您需要让编译器查找 Microsoft.Samples.EntityDataReader.EntityDataReaderExtensions 静态类。 此外,您还需要在解决方案中实际包含 EntityDataReader.cs 文件(但我希望这不是一个脑筋急转弯)。 其实我已经在项目中添加了那个类。但是使用 Microsoft.Samples.EntityDataReader 手动添加;在顶部夹杂物解决了它。谢谢阿伦。如果您将其作为答案,我会将其标记为已接受的答案。

以上是关于来自 SqlBulkCopy 的 LINQ 查询的数据读取器的主要内容,如果未能解决你的问题,请参考以下文章

SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit

来自 SQL 查询的 Linq Pivot

来自 SQL 数据库的大量记录的 Linq 查询和 Foreach

LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询

SqlBulkCopy效率低下原因分析

SQL Server 2008 R2 的可重试 SQLBulkCopy