0

以下のように、月単位のデータを含むソース データがあります。

Oct 2011
Nov 2011
Dec 2011
Jan 2012
Feb 2012

請求書が属するすべての月を選択する必要があります。請求書には以下のプロパティがあります。

Invoice.StartDate=13-10-2011;
Invoice.EndDate=11-01-2012;


sourceData.Where(x => x.SourceDate.Month >= Invoice.StartDate.Month && 
                 x.SourceDate.Year==Invoice.StartDate.Year && 
                 x.SourceDate.Month <= Invoice.EndDate.Month &&
                 x.SourceDate.Year == Invoice.EndDate.Year).ToList();

上記のクエリは 0 を返します。フィルター処理されたデータ ソースの結果は次のとおりです。

Oct 2011
Nov 2011
Dec 2011
Jan 2012

誰かが私が上記を達成するのを手伝ってくれますか?

4

5 に答える 5

2

このソリューションでは、直接比較できるように 0 に設定してDateTimes を作成するだけです。Day新しい を作成するのにより便利なため、クエリ構文を使用しますDateTime

startYearMonth = new DateTime(Invoice.StartDate.Year, Invoice.StartDate.Month, 0);
endYearMonth = new DateTime(Invoice.EndDate.Year, Invoice.EndDate.Month, 0);

(from data in sourceData
 let dataYearMonth = new DateTime(data.SourceDate.Year, data.SourceDate.Month, 0)
 where dataYearMonth >= startYearMonth && dataYearMonth <= endYearMonth
 select data).ToList();
于 2012-09-10T03:16:15.880 に答える
1

年が等しい場合を処理しましたが、年が開始年よりも大きい場合と年が終了年よりも小さい場合も処理する必要があります。

sourceData.Where(x => (x.SourceDate.Year > Invoice.StartDate.Year ||
                      (x.SourceDate.Month >= Invoice.StartDate.Month && 
                      x.SourceDate.Year == Invoice.StartDate.Year)) && 
                      (x.SourceDate.Year < Invoice.EndDate.Year ||
                      (x.SourceDate.Month <= Invoice.EndDate.Month &&
                      x.SourceDate.Year == Invoice.EndDate.Year))).ToList();

このソリューションはそれほど読みやすくなく、間違いを犯しやすいですが、元のソリューションに最も近いものです。

于 2012-09-10T03:01:37.003 に答える
0

日付比較だけでいいのではないですか?ソーステーブルの値が実際の日付アイテムであるかどうかはわかりませんが、必要に応じていつでもDate()コンストラクターを使用して適切な日付を作成できます。

sourceData.Where(x => x.SourceDate >= Invoice.StartDate && 
                 x.SourceDate <= Invoice.EndDate ).ToList();
于 2012-09-10T03:09:41.643 に答える
0

コードは次の場所でデータを探します。

x.SourceDate.Month >= Invoice.StartDate.Month AND x.SourceDate.Year==Invoice.StartDate.Year AND x.SourceDate.Month <= Invoice.EndDate.Month AND x.SourceDate.Year == Invoice.EndDate.年

これらの基準をすべて満たすデータはありません。以下を探す必要があります。

(x.SourceDate.Month >= Invoice.StartDate.Month AND x.SourceDate.Year==Invoice.StartDate.Year) OR (x.SourceDate.Month <= Invoice.EndDate.Month AND x.SourceDate.Year == 請求書.EndDate.Year)

このような:

sourceData.Where(x => (x.SourceDate.Month >= Invoice.StartDate.Month &&  
             x.SourceDate.Year==Invoice.StartDate.Year) ||  
             (x.SourceDate.Month <= Invoice.EndDate.Month && 
             x.SourceDate.Year == Invoice.EndDate.Year)).ToList();
于 2012-09-10T02:03:28.857 に答える
0

The year is unique. 2011 or 2012. But your where clause sets impossible option.

x.SourceDate.Year == Invoice.StartDate.Year && x.SourceDate.Year == Invoice.EndDate.Year

is same with

x.SourceDate.Year == 2011 && x.SourceDate.Year == 2012

How about this?

sourceData.Where(x => (x.SourceDate.Month >= Invoice.StartDate.Month && 
    x.SourceDate.Year==Invoice.StartDate.Year) || 
    (x.SourceDate.Month <= Invoice.EndDate.Month &&
    x.SourceDate.Year == Invoice.EndDate.Year)).ToList();
于 2012-09-10T01:55:38.573 に答える