我已经尝试了一段时间来为我正在尝试编写的linq查询找到一个合适的解决方案。
在我的模型结构中,我有一个item类,它包含一个paymentrecords列表。我希望我的查询实现的是:

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为空,例如,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)
                    )

最佳答案

你可以不用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>

关于c# - Entity Framework Linq SelectMany有条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15411335/

10-10 22:15