6

私はしばらくの間、記述しようとしている linq クエリに適した解決策を見つけようとしています。

私のモデル構造には、PaymentRecords のリストを保持する Item クラスがあります。クエリで達成したいことは次のとおりです。

public class PaymentRecord
{
    public int PaymentRecordId { get; set; }

    [Required]
    public double PaymentAmount { get; set; }

    [Required]
    public DateTime DateOfPayment { get; set; }

    [Required]
    public bool FinalPayment { get; set; }

    [JsonIgnore]
    public Item Item{ get; set; }
}

public class Item
{
    public int ItemId { get; set; }

    public List<PaymentRecord> PaymentRecords {get; set;}

    ...various other properties
}   

PaymentRecord リストが以下の条件に一致する (これで問題ありません)、または PaymentRecord が null である (例: Items クラスに PaymentRecord がない) すべてのアイテムを選択します。これを行う方法はありますか?

var result = m_context.Item
            .SelectMany(
                x => x.PaymentRecords.Where(p => (p.FinalPayment == true
                                              && p.DateOfPayment >= _revenueStatementRequest.StartDate
                                              && p.DateOfPayment <= _revenueStatementRequest.EndDate)
                                              || p.FinalPayment != true),
                (x, p) => x
            )
            .ToList();

理想的には、私は以下のようなことをしたいと思っていますが、私は仕事に似たものを手に入れることができませんでした:

var result = m_context.Item
            .SelectMany(
                x => x.PaymentRecords.Where(p => (p.FinalPayment == true
                                              && p.DateOfPayment >= _revenueStatementRequest.StartDate
                                              && p.DateOfPayment <= _revenueStatementRequest.EndDate)
                                              || p.FinalPayment != true)
                || x.PaymentRecords == null,
                (x, p) => x
            )
            .ToList();

与えられた答えから作業した後、私はこれを持っています:

 m_context.Item.Where(c => (!
                            c.PaymentRecords.Any(q => (q.FinalPayment &&
                                                            q.DateOfPayment >= _revenueStatementRequest.StartDate &&
                                                            q.DateOfPayment <= _revenueStatementRequest.EndDate)
                                                            || q.FinalPayment != true
                                                )
                            )
                    && (c..Type == Booked || c.Type == Reserved)
                    && (c.StartDate < _revenueStatementRequest.StartDate)
                    )
4

2 に答える 2

1

あなたはなしでそれを行うことができますSelectMany

        List<Item> res = m_context.Items
                      .Where(c => !c.PaymentRecords
                                .Any(q => (q.FinalPayment && 
                                        q.DateOfPayment >=_revenueStatementRequest.StartDate &&
                                        q.DateOfPayment <= _revenueStatementRequest.EndDate)
                                        || !q.FinalPayment)
                            )
    //**EDIT**
    .Where(c => c.StartDate < _revenueStatementRequest.StartDate)
 //this is comment out, so we can better test on the more complex part of the query
  //.Where(c => c.Type == Booked || c.Type == Reserved)   
    .ToList();

そうすれば、List<Item>代わりにList<PaymentRecord>

于 2013-03-14T14:10:52.507 に答える
1

PaymentRecord リストが以下の条件に一致する (これで問題ありません)、または PaymentRecord が null である (例: Items クラスに PaymentRecord がない) すべてのアイテムを選択します。

var result = m_context.Item
                      .Where(x => !x.PaymentRecords.Any() ||
                                   x.PaymentRecords.Any(p => (p.FinalPayment == true
                                                        && p.DateOfPayment >= _revenueStatementRequest.StartDate
                                                        && p.DateOfPayment <= _revenueStatementRequest.EndDate)
                                                        || p.FinalPayment != true))
                      .ToList();

ここを使う理由が見当たりませんSelectMany。単純なWhere条件で作業を行うことができます。

于 2013-03-14T14:11:44.197 に答える