다른 기준으로 DataTable을 필터링하는 데 문제가 있습니다. 나는 첫 번째 조항을 알고있다.여러 기준을 충족하는 테이블의 LINQ 필터/DateDifference
where row.Field<TimeSpan>("DateDifference") >= TimeSpan.Zero
은 세 번째 기준이 충족되지 않는 이유이다. 모든 요구 사항을 충족시키기 위해 쿼리를 변경하는 방법이 있습니까?
- 날짜 차이는 양수 여야합니다.
- 가장 작은 DateDifference를 선택해야합니다.
모든 InventoryChanges가 결과에 있어야합니다. 음수가 음수 인 경우에는 DateDifference가 허용됩니다. 가장 작은 음수 DateDiff를 선택해야합니다. 지금까지
ArticleNo Article Price PriceSet InventoryChange DateDifference StockDifference 1 Article A 10 01.01.2012 02.01.2012 1 -2 1 Article A 11 01.06.2012 02.01.2012 -151 -2 2 Article B 14 01.01.2012 05.01.2012 4 1 2 Article B 14 01.01.2012 04.10.2012 277 -3 2 Article B 13 01.06.2012 05.01.2012 -148 1 2 Article B 13 01.06.2012 04.10.2012 125 -3 3 Article C 144 01.04.2012 28.02.2012 -33 -1 3 Article C 124 01.05.2012 28.02.2012 -63 -1 My result: 1 Article A 10 01.01.2012 02.01.2012 1 -2 2 Article B 14 01.01.2012 05.01.2012 4 1 2 Article B 13 01.06.2012 04.10.2012 125 -3 What I want to have is a table where the last row, where there is no positive DateDifference, is added. The row with the smallest DateDifference should be selected: 1 Article A 10 01.01.2012 02.01.2012 1 -2 2 Article B 14 01.01.2012 05.01.2012 4 1 2 Article B 13 01.06.2012 04.10.2012 125 -3 3 Article C 144 01.04.2012 28.02.2012 -33 -1
내 쿼리 :
var query = from row in InventoryChanges.AsEnumerable()
where row.Field<TimeSpan>("DateDifference") >= TimeSpan.Zero
group row by new
{
ArticleNo = row.Field<Int32>("ArticleNo"),
Article = row.Field<String>("Article"),
InventoryChange = row.Field<DateTime>("InventoryChange"),
StockDifference = row.Field<Int32>("StockDifference")
}
into grp
select new
{
ArticleNo = grp.Key.ArticleNo,
Article = grp.Key.Article,
InventoryChange = grp.Key.InventoryChange,
PriceSet = grp.Where(r => r.Field<TimeSpan>("DateDifference") == grp.Select(min => min.Field<TimeSpan>("DateDifference")).Min())
.Select(r => r.Field<DateTime>("PriceSet")).FirstOrDefault(),
DateDifference = grp.Select(r => r.Field<TimeSpan>("DateDifference")).Min(),
StockDifference = grp.Key.StockDifference,
Price = grp.Where(r => r.Field<TimeSpan>("DateDifference") == grp.Select(min => min.Field<TimeSpan>("DateDifference")).Min())
.Select(r => r.Field<Decimal>("Price")).FirstOrDefault(),
};
은 어떤 도움에 감사드립니다!
DataTable InventoryChanges = new DataTable("InventoryChanges");
InventoryChanges.Columns.Add("ArticleNo", typeof(Int32));
InventoryChanges.Columns.Add("Article", typeof(String));
InventoryChanges.Columns.Add("Price", typeof(Decimal));
InventoryChanges.Columns.Add("PriceSet", typeof(DateTime));
InventoryChanges.Columns.Add("InventoryChange", typeof(DateTime));
InventoryChanges.Columns.Add("DateDifference", typeof(TimeSpan));
InventoryChanges.Columns.Add("StockDifference", typeof(Int32));
DataRow dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 1, "Article A", 10, new DateTime(2012, 1, 1), new DateTime(2012, 1, 2), new TimeSpan(1, 0, 0, 0), -2 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 1, "Article A", 11, new DateTime(2012, 6, 1), new DateTime(2012, 1, 2), new TimeSpan(-151, 0, 0, 0), -2 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 2, "Article B", 14, new DateTime(2012, 1, 1), new DateTime(2012, 1, 5), new TimeSpan(4, 0, 0, 0), 1 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 2, "Article B", 14, new DateTime(2012, 1, 1), new DateTime(2012, 10, 4), new TimeSpan(277, 0, 0, 0), -3 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 2, "Article B", 13, new DateTime(2012, 6, 1), new DateTime(2012, 1, 5), new TimeSpan(-148, 0, 0, 0), 1 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 2, "Article B", 13, new DateTime(2012, 6, 1), new DateTime(2012, 10, 4), new TimeSpan(125, 0, 0, 0), -3 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 3, "Article C", 144, new DateTime(2012, 4, 1), new DateTime(2012, 2, 28), new TimeSpan(-33, 0, 0, 0), -1 };
InventoryChanges.Rows.Add(dr);
dr = InventoryChanges.NewRow();
dr.ItemArray = new object[] { 3, "Article C", 124, new DateTime(2012, 5, 1), new DateTime(2012, 2, 28), new TimeSpan(-63, 0, 0, 0), -1 };
InventoryChanges.Rows.Add(dr);
그 실행 가능한 만약 당신이 코드로 샘플 데이터를 제공하려는 경우 정말 도움이 될 것이다 :
편집 이것은 당신 제공하는 샘플 데이터에 따라 위의 쿼리의 결과입니다. 'var tbl = new DataTable; tbl.Columns.Add (..); tbl.Rows.Add (...); ...' –
.csv 파일에서 데이터를 읽고 DataTable을 동적으로 만듭니다. 하지만 같은 구조의 DataTable을 만들 것입니다. – abeldenibus
우리는 여기서 긍정적 인 DateDifference만을 사용하지 않습니다 ... "where row.Field ("DateDifference ")> = TimeSpan.Zero"? –