c# - 我可以使用 Linq 投影新类型的数据行吗?

标签 c# .net linq datatable strongly-typed-dataset

我目前有一个 csv 文件,我正在使用此处的示例进行解析: http://alexreg.wordpress.com/2009/05/03/strongly-typed-csv-reader-in-c/

然后我想循环记录并使用类型化数据集 xsd 将它们插入到 Oracle 数据库中。

这并不难,就像:

foreach (var csvItem in csvfile)
{
   DataSet.MYTABLEDataTable DT = new DataSet.MYTABLEDataTable();
   DataSet.MYTABLERow row = DT.NewMYTABLERow();
   row.FIELD1 = csvItem.FIELD1;
   row.FIELD2 = csvItem.FIELD2;
}

我想知道如何使用 LINQ 投影做一些事情:

var test = from csvItem in csvfile
  select new MYTABLERow {
    FIELD1 = csvItem.FIELD1,
    FIELD2 = csvItem.FIELD2
}

但我认为如果不使用 rowbuilder 或更好的数据行构造函数,我无法创建这样的数据行?

最佳答案

可以,但你不应该NewRow() 是一种方法,而不是允许使用对象初始值设定项的构造函数。为清楚起见,您最好坚持使用 foreach 循环。

您可以滥用 LINQ 来完成此操作,但不推荐并仅用于演示目的:

DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Customer", typeof(string));
dt.Rows.Add(new Object[] { 24, "Peter Parker" });
dt.Rows.Add(new Object[] { 42, "Bruce Wayne" });

var query = Enumerable.Range(1, 5).All(i =>
            {
                var row = dt.NewRow();
                row["Id"] = i;
                row[1] = "Customer" + i;
                dt.Rows.Add(row);
                return true;
            });

foreach (DataRow row in dt.Rows)
{
    Console.WriteLine("{0}: {1}", row[0], row[1]);
}

想法是使用 lambda 语句来完成您的工作。请注意,您一无所获,语句将与您在 foreach 循环中的语句相同。最重要的是,LINQ 是延迟的,因此在迭代查询之前不会添加行。在上面的代码片段中,我通过使用 All 方法并为每个项目返回 true 来强制立即执行此操作,以便继续处理所有项目。事实上,var query = 位可以删除,因为它未被使用。

在您的情况下,您的来源将是 csv 文件:

csvfile.All(csvItem => { /* do work here */ });

这种方法会带来副作用,因为 LINQ 查询并未用于其原始目的。 LINQ 用于查询。您可能还会发现 Eric Lippert 的帖子有帮助:"foreach" vs "ForEach" .

关于c# - 我可以使用 Linq 投影新类型的数据行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2505290/

相关文章:

jquery - 将 JSON 从服务器端 (.NET) 传递到客户端 (jQuery)

javascript - 将 .Net LINQ 查询转换为 Angular 2 TypeScript/JavaScript

vb.net - 在 VB.NET 中通过 LINQ 对通用列表进行分组

c# - 无法连接到 Xamarin.Android(C#) 中的 Web 服务

c# - 如何在linq中选择最大的字符串到nhibernate

c# - 在列表中使用 Linq 选择列表

.net - .NET-查询完成之前开始从DataReader读取?

c# - 通过 Microsoft HPC 上的 Com-interop C# API 打开 excel 文件

.net - Azure WebJob QueueTrigger 消息未从队列中删除

c# - 将 Linq-to-SQL 中的计算属性映射到实际 SQL 语句