gpt4 book ai didi

c# - 如何通过自定义加入数据集来获取此 Linq 查询?

转载 作者:行者123 更新时间:2023-11-30 14:33:24 25 4
gpt4 key购买 nike

在使用 join 时,我似乎无法通过 Linq 的 select 子句使用的匿名类型。我想将查询结果放入数据表中。这是我在运行时内存中的内容...

DataTable1 (source)
----------
col1A <int> (acting PK, not explicitly defined as such)
col1B <string>
col1C <string>
col1D <string> (FK -> dt2.col2A, also not explicitly defined)
col1E <string>

DataTable2 (source)
----------
col2A <string> (acting PK, also not explicitly defined)
col2B <string>

DataTable3 (destination)
----------
colA <int>
colB <string>
colC <string>
colD <string>

这就是我想要的(与我正在寻找的 SQL 等效)...

INSERT INTO DataTable3 (colA, colB, colC, colD)
SELECT dt1.col1A, dt1.col1B, dt1.col1C, dt2.col2B
FROM DataTable1 dt1
LEFT JOIN DataTable2 dt2 ON (dt1.col1D = dt2.col2A)

往回看,我看到这条简单的行将枚举的查询结果集放入数据表中:

DataTable DataTable3 = query.CopyToDataTable();

这是我尝试过的...我不知道如何以允许我使用它的方式构建“查询”。尝试 1(使用 var 查询;这有效,请进一步阅读):

var query =
from dt1 in DataTable1.AsEnumerable()
join dt2 in DataTable2.AsEnumerable()
on dt1.Field<string>("col1D") equals dt2.Field<string>("col2A")
select new { col1A = dt1.Field<int>("col1A"),
col1B = dt1.Field<string>("col1B"),
col1C = dt1.Field<string>("col1C"),
col2B = dt2.Field<string>("col2B") };

但这给了我关于“query.CopyToDataTable()”的这个错误:

"Error 1 The type 'AnonymousType#1' cannot be used as type parameter 'T' in the generic type or method 'System.Data.DataTableExtensions.CopyToDataTable(System.Collections.Generic.IEnumerable)'. There is no implicit reference conversion from 'AnonymousType#1' to 'System.Data.DataRow'."

据我推测,这个错误是因为“select new”没有将 DataRows 构建到“query”中,这正是 .CopyToDataTable() 所要求的;它只是建立匿名记录。此外,我不知道如何将查询元素转换为 DataRow,因为“它由于保护级别而无法访问”。

尝试 2(使用 IEnumerable 查询;不要费心尝试这个):

IEnumerable<DataRow> query =
from dt1 in DataTable1.AsEnumerable()
join dt2 in DataTable2.AsEnumerable()
on dt1.Field<string>("col1D") equals dt2.Field<string>("col2A")
select new { col1A = dt1.Field<int>("col1A"),
col1B = dt1.Field<string>("col1B"),
col1C = dt1.Field<string>("col1C"),
col2B = dt2.Field<string>("col2B") };

这会在“加入”时出错:

"Error 5 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)"

附带说明一下,如果我注释掉“join”子句(以及“select”中相应的 dt2 列),我会在“select”上收到此错误:

"Error 2 Cannot implicitly convert type 'System.Data.EnumerableRowCollection' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)"

我还尝试使用列预定义 DataTable3,为“select”子句提供一个真正的 DataRow,但我仍然无法让“select”利用它。


编辑、细节、解决方案:感谢蒂姆的帮助。我选择了尝试 1(var 查询)。我还预先定义了 DataTable3:

DataTable DataTable3 = new DataTable();
DataTable3.Columns.Add("colA", System.Type.GetType("System.Int32"));
DataTable3.Columns.Add("colB", System.Type.GetType("System.String"));
DataTable3.Columns.Add("colC", System.Type.GetType("System.String"));
DataTable3.Columns.Add("colD", System.Type.GetType("System.String"));

我按照 Tim 的建议使用 foreach 循环存储了“查询”的结果:

foreach (var x in query)
{
DataRow newRow = DataTable3.NewRow();
newRow.SetField("colA", x.col1A);
newRow.SetField("colB", x.col1B);
newRow.SetField("colC", x.col1C);
newRow.SetField("colD", x.col2B);
DataTable3.Rows.Add(newRow);
}

这可以通过一些额外的努力以几种方式通用化,但这对我的目的来说已经足够好了。

最佳答案

Linq 应该只用于查询。使用它来查询源代码并构建您的匿名类型。然后使用 foreach添加 DataRows .一般来说:你不能使用 CopyToDataTable除了IEnumerable<DataRow>以外的任何东西.这就是匿名类型错误的原因。

(有一个使用反射的解决方法,我一般不建议:

Implement CopyToDataTable<T> Where the Generic Type T Is Not a DataRow )

恕我直言foreach是你能做的最好的,因为它非常易读:

var query =
from dt1 in DataTable1.AsEnumerable()
join dt2 in DataTable2.AsEnumerable()
on dt1.Field<string>("col1D") equals dt2.Field<string>("col2A")
select new
{
col1A = dt1.Field<int>("col1A"),
col1B = dt1.Field<string>("col1B"),
col1C = dt1.Field<string>("col1C"),
col2B = dt2.Field<string>("col2B")
};

foreach (var x in query)
{
DataRow newRow = DataTable3.Rows.Add();
newRow.SetField("col1A", x.col1A);
newRow.SetField("col1B", x.col1B);
newRow.SetField("col1C", x.col1C);
newRow.SetField("col2B", x.col2B);
}

关于c# - 如何通过自定义加入数据集来获取此 Linq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16574125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com