C# 将多个linq查询和连接的结果组合成一个较小的查询
我是否可以将以下内容重新构造为更紧凑的linq查询,理想情况下不需要引入辅助函数C# 将多个linq查询和连接的结果组合成一个较小的查询,c#,linq,linq-to-dataset,C#,Linq,Linq To Dataset,我是否可以将以下内容重新构造为更紧凑的linq查询,理想情况下不需要引入辅助函数 var revPerUnitChanges = from row in this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable() let field = "Rev/Unit" select new { Field = field, From = row.Field<decimal&g
var revPerUnitChanges =
from row in this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable()
let field = "Rev/Unit"
select new {
Field = field,
From = row.Field<decimal>(field, DataRowVersion.Original),
To = row.Field<decimal>(field, DataRowVersion.Current),
ItemIds = row.Field<string>("ItemIds"),};
var costPerUnitChanges =
from row in this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable()
let field = "Cost/Unit"
select new {
Field = field,
From = row.Field<decimal>(field, DataRowVersion.Original),
To = row.Field<decimal>(field, DataRowVersion.Current),
ItemIds = row.Field<string>("ItemIds"), };
var numUnitsChanges =
from row in this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable()
let field = "Units"
select new {
Field = field,
From = row.Field<decimal>(field, DataRowVersion.Original),
To = row.Field<decimal>(field, DataRowVersion.Current),
ItemIds = row.Field<string>("ItemIds"), };
var changes =
revPerUnitChanges
.Concat(costPerUnitChanges
.Concat(numUnitsChanges))
.Where(c => c.From != c.To);
var revPerUnitChanges=
来自this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable()中的行
let field=“Rev/Unit”
选择新的{
字段=字段,
From=行.字段(字段,DataRowVersion.Original),
To=行.字段(字段,DataRowVersion.Current),
ItemIds=row.Field(“ItemIds”),};
var costPerUnitChanges=
来自this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable()中的行
let field=“成本/单位”
选择新的{
字段=字段,
From=行.字段(字段,DataRowVersion.Original),
To=行.字段(字段,DataRowVersion.Current),
ItemIds=row.Field(“ItemIds”),};
变量numUnitsChanges=
来自this.DataTable.GetChanges(DataRowState.Modified).AsEnumerable()中的行
让field=“单位”
选择新的{
字段=字段,
From=行.字段(字段,DataRowVersion.Original),
To=行.字段(字段,DataRowVersion.Current),
ItemIds=row.Field(“ItemIds”),};
风险值变化=
重新审视变化
.Concat(成本变化)
.Concat(Numunitchanges))
.式中(c=>c.From!=c.To);
首先创建一个helper类来保存数据。(您的代码使用匿名类型不会有任何问题,但如果您想将节重构为方法,使用命名类会容易得多。)
我只是想说声谢谢-我一字不差地使用了你的代码,这是一种改进,它添加到了我的工具箱中,使事情得以完成。。。
public class MyClass //TODO give better name
{
public MyClass(DataRow row, string field) //You could have a public static generate method if it doesn't make sense for this to be a constructor.
{
Field = field;
From = row.Field<decimal>(field, DataRowVersion.Original);
To = row.Field<decimal>(field, DataRowVersion.Current);
ItemIds = row.Field<string>("ItemIds");
}
public string Field { get; set; }
public decimal From { get; set; }
public decimal To { get; set; }
public string ItemIds { get; set; }
}
var changes = dataTable.GetChanges(DataRowState.Modified)
.AsEnumerable()
.Select(row => new[]{ //create 3 new items for each row
new MyClass(row, "Rev/Unit"),
new MyClass(row, "Cost/Unit"),
new MyClass(row, "Units"),
})
.SelectMany(item => item) //flatten the inner array
.Where(item => item.From != item.To);