我在设计一种将CSV数据导入业务对象的方法时遇到了麻烦。我首先解析CSV,然后将每一行放入DataTable,这就是我的思维障碍所在。
我有以下课程,其中APDistribution被视为具有1:1关系的Voucher的子级:
public class Voucher
{
public string GPVoucherNumber { get; set; }
public string VendorID { get; set; }
public string TransactionDescription { get; set; }
public string Title { get; set; }
public string DocNumber { get; set; }
public DateTime DocDate { get; set; }
public decimal PurchaseAmount { get; set; }
public IEnumerable<APDistribution> Distributions { get; set; }
}
public class APDistribution
{
public string AccountNumber { get; set; }
public decimal Debit { get; set; }
public decimal Credit { get; set; }
public string DistributionReference { get; set; }
}
我的CSV看起来像这样。几个字段可以重复表示凭证交易(供应商,标题发票编号,发票金额等),而某些字段是分配明细(日记帐科目代码,日记帐金额)。
我开始以为可以使用Linq投影到业务对象上,但是我没有看到如何构造查询以一次性完成。我发现自己想知道是否可以执行一个查询以将其投影到Voucher集合中,或者执行一个查询以将其关联到APDistribution集合中,然后执行某种代码来正确地关联它们。
我从以下内容开始,在这里我按应该唯一定义Voucher的字段进行分组,但这不起作用,因为投影处理的是匿名类型而不是DataRow。
var vouchers =
from row in invoicesTable.AsEnumerable()
group row by new { vendor = row.Field<string>("Vendor Code"), invoice = row.Field<string>("Vendor Invoice Number") } into rowGroup
select new Voucher
{ VendorID = rowGroup.Field<string>("Vendor Code") };
在不引入复杂的Linq的情况下是否可以实现这一点,未来的开发人员(包括我自己)可能很难理解/维护?没有我忽略的没有Linq的简单方法吗?
总体思路是:
invoicesTable
.AsEnumerable()
.GroupBy(x=> new { row.Field<string>("Vendor Code"), row.Field<string>("Vendor Invoice Number")})
.Select(grouping =>
new Voucher
{
VendorID = grouping.First().Field<string>("VendorId") /* and so on */
Distributions = grouping.Select(somerow => new redistribution {AccountNumber = somerow.Field<string>("AccountNumber") /* and so on */}
}
但这不是最优雅的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句