LINQ查询中的Datareader用于SqlBulkCopy

3

我正在使用这个库:

链接到EntityDataReader

用于将一些来自xml解析的linq查询结果放入数据库中,使用sqlbulkcopy,该方法使用datareader直接存储数据,而无需使用datatable或其他数据结构。

但是我无法实现它。

这是我迄今为止写的代码,但没有成功:

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' 的方法,且找不到接受类型为 'System.Collections.Generic.IEnumerable AnonymousType#1>' 的第一个参数的扩展方法 'AsDataReader' (是否缺少 using 指令或程序集引用?)

它是什么?我该如何修复它?

谢谢


我认为这是编译器错误而不是异常,对吗? - Aron
2
大家好。我非常想获取这个库,但是我按照链接进去后发现它已经被下架了。有人知道在哪里可以下载到吗? - serlingpa
1
截至2020年,在GitHub上仍有一个版本可用:Repository/Repository.EntityFramework/EntityDataReader.cs,由Matthew Schrager维护,该版本在微软停用后仍然可用。 - Suncat2000
1个回答

3

基本上,这个错误是说你不能使用“AsDataReader”方法将参数设置为“IEnumerable”对象,因为没有这样的定义的方法。如果可能的话,请尝试在引用中添加DLL “System.Data.Entity”和System.Data.EntityClient


尝试过了,但我没想到它会起作用。这只是一个从匿名类型到Ienumerable列表的错误转换问题或类似的问题。 - Liquid Core
“orders”变量是什么类型?我猜测你的LINQ查询结果并不返回可以应用“AsDataReader()”方法的内容。顺便问一下:为什么要放两个“.AsEnumerable()”?我认为只需要一个就可以了。 - spaghettifunk
刚刚看了你添加的示例。你需要在顶部加上 using Microsoft.Samples.EntityDataReader(除非你已经将源更改为 EntityDataReader.cs 文件)。原因是你需要让编译器查找 Microsoft.Samples.EntityDataReader.EntityDataReaderExtensions 静态类。 - Aron
此外,您需要确实将 EntityDataReader.cs 文件包含在您的解决方案中(但我希望这是显而易见的)。 - Aron
实际上,我已经将那个类添加到项目中了。但是在顶部的包含中手动添加 Microsoft.Samples.EntityDataReader; 解决了问题。谢谢 Aron。如果你把它作为答案,我会标记它为被接受的答案。 - Liquid Core

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接