因此,我有两个DataTable,它们均取自同一ODBC数据源。一个包含用于销售的行(Estado ='VENTAS'),另一个包含Estado ='EXIST'的行(数据库为每个销售创建行对,一个指示销售信息,另一个指示有关商店库存中库存变动的信息,因此在为了知道哪个商店进行了销售,我必须将每个VENTAS行与相应的EXIST行匹配(通过“ Documento” ID字段),并从Exist行中获取“ Deposito”值)。
我建立了这个查询来执行此操作(我正在使用的ODBC驱动程序不允许进行联接,因此在Linq中执行此操作是下一个最好的选择)
DataTable dtResult = new DataTable();
dtResult.Columns.Add("Documento", typeof(Int64));
dtResult.Columns.Add("Fecha", typeof(DateTime));
dtResult.Columns.Add("Articulo", typeof(string));
dtResult.Columns.Add("Deposito", typeof(string));
dtResult.Columns.Add("ImpDMn", typeof(decimal));
dtResult.Columns.Add("Cantidad", typeof(decimal));
dtResult.Columns.Add("Partida", typeof(string));
var result = from dataRows1 in VentasDT.AsEnumerable() //VentasDT is the DataTable with the VENTAS data
join dataRows2 in ExistDT.AsEnumerable() // ExistDT is the DataTable with the EXIST data
on dataRows1.Field<Int64>("Documento") equals dataRows2.Field<Int64>("Documento")
select dtResult.LoadDataRow(new object[]
{
dataRows1.Field<Int64>("Documento"),
dataRows1.Field<DateTime>("Fecha"),
dataRows1.Field<string>("Articulo"),
dataRows2.Field<string>("Deposito"),
dataRows1.Field<decimal>("ImpDMn"),
dataRows1.Field<decimal>("Cantidad"),
dataRows1.Field<string>("Partida"),
}, false);
result.CopyToDataTable();
它可以工作,但是由于某些原因它会重复一些行。我检查了重复的行,它们彼此相同。它们的文档编号是相同的(每个Documento编号只有一个VENTAS和一个EXIST行,包括这些重复项),所以我不知道为什么要重复它们。我检查了要加入的源数据表,同样,每个重复项中只有一行对应。EXIST表大于VENTAS表(它还记录非销售商店之间的转移),但联接表大于任一表(但还不及两者的总和)
VENTAS: 85123
EXIST: 116857
JOIN: 141287
我的查询有问题吗?我应该包括一些GROUP BY子句还是.Distinct还是这个结构(就我所见,应该模仿一个左联接)就足够了?
由于执行此连接的唯一原因是"Deposito"
要从中获取字段的值,因此ExistDT
可以将其替换为字典查找。这是您可以执行的操作:
var depositoPorDocumento = ExistDT.AsEnumerable().ToDictionary(
dr => dr.Field<Int64>("Documento"),
dr => dr.Field<string>("Deposito")
);
foreach (var vr in VentasDT.AsEnumerable()) {
Int64 id = Field<Int64>("Documento");
string deposito;
if (!depositoPorDocumento.TryGetValue(id, out deposito)) {
continue;
}
dtResult.LoadDataRow(new object[]
{
id,
vr.Field<DateTime>("Fecha"),
vr.Field<string>("Articulo"),
deposito,
vr.Field<decimal>("ImpDMn"),
vr.Field<decimal>("Cantidad"),
vr.Field<string>("Partida"),
}, false);
}
result.CopyToDataTable();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句