使用LINQ从数据集中选择单列

23

我正在努力理解所有的LINQ知识,但似乎卡在了第一步。

我有一个如下所示的数据表:

OrderNo     LetterGroup Filepath
----------- ----------- --------------------------------------------------
0           0           Letters/SampleImage.jpg
0           0           Letters/UKPC7_0.jpg
0           0           Letters/UKPC8_0.jpg
我需要的是将Filepath列中的所有文件路径获取到一个字符串数组中。我认为LINQ非常适合这个问题(我说得对吗?),但似乎无法构造正确的查询语句。
请问是否有人能够提供一些代码示例,指导我朝着正确的方向前进?我已经搜索过了,但好像没有什么进展。
3个回答

34

有一些扩展方法可以使得与数据集的操作更加容易:

using System.Data.Linq;

var filePaths =
    from row in dataTable.AsEnumerable()
    select row.Field<string>("Filepath");

var filePathsArray = filePaths.ToArray();
你也可以使用方法语法将它放在一个语句中:
var filePaths = dataTable
    .AsEnumerable()
    .Select(row => row.Field<string>("Filepath"))
    .ToArray();

为什么我会收到“dataTable不包含“Field”的定义”错误信息? - Spero
@Spero:听起来像是缺少扩展方法。你有包含这个吗?using System.Data.Linq; - Bryan Watts
谢谢回复。我已经添加了必要的汇编和包含文件,但错误仍然存在。我正在从DbContext中获取数据,而不是DataSet。我还不知道如何在Linq中使用DataSet。 - Spero
我找到了这个链接:https://dev59.com/Yobca4cB1Zd3GeqPW4nv。这是必要的吗? - Spero
@Spero:这个答案仅适用于使用 DataSet 的情况。如果您正在使用 DbContext,那么在那里有方法可以做到这一点。不要将您的 DbContext 转换为 DataSet,只是为了使用这个答案。 - Bryan Watts
显示剩余2条评论

12
string[] filePaths = (from DataRow row in yourDataTable.Rows 
                     select row["Filepath"].ToString()).ToArray();

这根本没有使用LINQ。 - poindexter12
2
@poindexter12 - 什么?看起来很像LINQ。 - John Farrell
@jfar:这在技术上是LINQ语法,所以我取消了我的反对票。然而,就问题的本质而言,我认为还有更多可以解释的地方。 - poindexter12
@poindexter,OP要求如何使用LINQ查询数据集,而不是要求完全改变他的数据访问策略。这肯定是LINQ-to-Objects的经典用法。您建议他转向LINQ-to-Entities(或等效模型)。 - Anthony Pegram
我完全同意,我会让他使用LINQ to Sql。 - poindexter12

2

如果您想一路使用LINQ,请设置好您的数据库并创建上下文对象。然后您应该能够像这样做:

 var filepaths = from order in _context.Orders
                 select order.Filepath;

假设您的行表格名称为“Orders”,这是我根据您的第一列名称“order”猜测的。如果您想要返回一组订单号,以便稍后使用以了解文件路径来自何处,您可以执行以下操作:
var results = from order in _context.Orders
              select new
              {
                  order.OrderNo,
                  order.Filepath
              }

这将为您提供一个新的匿名类型,其中包含这两个值作为属性。

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