【问题标题】:Can I use Linq to project a new typed datarow?我可以使用 Linq 来投影一个新的类型化数据行吗?
【发布时间】:2010-03-24 04:13:08
【问题描述】:

我目前有一个 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
}

但我不认为如果不使用行构建器或者数据行的更好构造器,我不能创建这样的数据行?

【问题讨论】:

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


    【解决方案1】:

    可以,但你不应该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 是延迟的,因此在迭代查询之前永远不会添加行。在上面的 sn-p 中,我通过使用 All 方法强制它立即生效,并为每个项目返回 true,以便继续处理所有项目。事实上,var query = 位可以删除,因为它没有被使用。

    在您的情况下,您的来源将是 csvfile:

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

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

    【讨论】:

    • 谢谢,这大概就是感觉尴尬的原因吧。
    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多