【问题标题】:Using LINQ, how can I get a joined table returned as IEnumerable<DataRow>使用 LINQ,如何获得以 IEnumerable<DataRow> 形式返回的连接表
【发布时间】:2019-02-04 06:26:04
【问题描述】:

我经常使用 SQL,并且尝试将相同的连接逻辑传输到针对 DataSet 的 LINQ 查询。 DataSet 是一组从 SQL 查询中提取的表。

我设法让这个加入工作 -

        IEnumerable<DataRow> query =
            from a in ds.Tables["Names"].AsEnumerable()
            join b in ds.Tables["NameHasAffiliate"].AsEnumerable()
                on a.Field<int>("PK") equals b.Field<int>("fk_MainTable_PK")
            select a;

这不能编译:

select a.Field<int>("PK"), a.Field<string>("Name")

也没有

select new { PK = a.Field<int>("PK"), Name = a.Field<string>("Name") }

它肯定查询正确(我看到预期的行数和重复的表 a 数据)但这只是返回表 a 列 - 显然是因为 select a

我已尝试更改为 select new { a, b } 并将查询包装在 () 中以在最后添加 .ToList(),但两者都没有编译为我提供查询的 IEnumerable 版本以进行简单的表转换之后使用

DataTable boundTable = query.CopyToDataTable<DataRow>();

如何选择这样的所有列? 或者更确切地说,如果我要加入很多表,如何指定每个表中的哪些列?

【问题讨论】:

  • 你可以试试select a.propertyName, b.proprtyNameselect new { Name = a.Name, Name1 = b.Name1 };
  • 你能把NamesNameHasAffiliate 表的attributes 都发一下吗?
  • 如您所见,我没有通过任何类型的数据对象定义属性。我正在在线定义它们,例如a.Field&lt;int&gt;("PK") 并在 select 部分使用该语法无法编译。
  • 我认为这个链接会帮助你。 stackoverflow.com/questions/37849027/…
  • 感谢您的建议,但我想也许我只需要创建数据对象,这样我就可以按名称调用属性:/

标签: c# linq


【解决方案1】:

这是因为返回 DataRow 以外的任何内容在您的示例中都不起作用,因为您将查询定义为 IEnumerable&lt;DataRow&gt; 类型。因此,如果您要返回一个字段或字段集合,那么您需要更改预期的返回类型。

我尝试了以下方法,效果很好。

var ds = new DataSet();

ds.Tables.Add("Names");
ds.Tables["Names"].Columns.Add("PK", typeof(Int32));
ds.Tables["Names"].Columns.Add("Name", typeof(String));
ds.Tables["Names"].Rows.Add("1", "NameValue1");

ds.Tables.Add("NameHasAffiliate");
ds.Tables["NameHasAffiliate"].Columns.Add("fk_MainTable_PK", typeof(Int32));
ds.Tables["NameHasAffiliate"].Columns.Add("AffiliateValue", typeof(String));
ds.Tables["NameHasAffiliate"].Rows.Add("1", "AffiliateValue1");



var query = 
    ds.Tables["Names"].AsEnumerable()
        .Join(
            ds.Tables["NameHasAffiliate"].AsEnumerable(), 
            n => n.Field<int>("PK"), a => a.Field<int>("fk_MainTable_PK"),
            (n, a) => new { Key = n.Field<Int32>("PK"), Name = n.Field<String>("Name")})
        .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多