首页 > 解决方案 > 使用 LINQ 比较两个列表,并使用一个或另一个的结果生成第三个列表

问题描述

我有两个元素列表,它们仅在IsTemporalPaymentTerm布尔字段上有所不同。

我想使用 LINQ 逐个比较这两个列表,并生成第三个列表,对于每个条目,该列表具有 where IsTemporalPaymentTerm = true如果没有,那么我想要一个 where IsTemporalPaymentTerm = false

这是一些示例代码:

var allResults = db.PaymentTerms
                       .AsQueryable()
                       .Where(y => y.WorkDate == date
                               && y.ProjectID == ProjectID 
                               && y.CompanyID == CompanyID
                               && y.PayeeID == PayeeID);

//TABLE WITH ONLY TEMPORAL PAYMENT TERMS
var onlyTemporalResults = allResults.Where(x => x.IsTemporalPaymentTerm);

//TABLE WITH ONLY NON-TEMPORAL PAYMENT TERMS
var nonTemporalResults = allResults.Where(x => !x.IsTemporalPaymentTerm);

所以,基本上我想要的是与 进行比较onlyTemporalResultsnonTemporalResults并获得一个最终列表,其中包含临时支付期限,或者如果找不到临时支付期限,则为非临时支付期限。

伪代码示例:

List<PaymentTerms> TemporalPaymentTerms = new List<PaymentTerms>();
PaymentTerm unnaprovedPT1 = new PaymentTerm  { PayeeID = 1, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false };
PaymentTerm unnaprovedPT2 = new PaymentTerm  { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false };

TemporalPaymentTerms.Add(unnaprovedPT1); 
TemporalPaymentTerms.Add(unnaprovedPT2);  
   
List<PaymentTerms> NonTemporalPaymentTerms = new List<PaymentTerms>();
PaymentTerm approvedPT1 = new PaymentTerm  { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true};
PaymentTerm approvedPT1 = new PaymentTerm  { PayeeID = 3, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true};

//LINQ query that merges both lists goes here.
    
//FINAL EXPECTED RESULT:
List<PaymentTerms> FinalList = [
{PayeeID = 1, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false},
{PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false},
{PayeeID = 3, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true}
];

我知道这可以通过迭代两个列表(临时和非临时付款条款),然后比较它们来完成,但我想我的问题是:

使用单个 LINQ 查询可以更高效、更优雅地完成这项工作吗?也许我缺少某种形式的加入?有条件的 Where 子句?

到目前为止,我还没有看到答案。提前致谢!

标签: c#.netperformanceentity-frameworklinq

解决方案


这是你要找的吗?

static void Main(string[] args)
{
    RunPaymentTermsTest();
    Console.WriteLine("Done!");
    Console.ReadLine();
}

private static void RunPaymentTermsTest()
{
    var temporalPaymentTerms = new List<PaymentTerm>
    {
        new PaymentTerm { PayeeID = 1, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false },
        new PaymentTerm { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false }
    };

    var nonTemporalPaymentTerms = new List<PaymentTerm>()
    {
        new PaymentTerm { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true },
        new PaymentTerm { PayeeID = 3, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true }
    };

    var toAdd = temporalPaymentTerms
        .Where(x =>
            !nonTemporalPaymentTerms.Any(y =>
                y.CompanyID == x.CompanyID &&
                y.PayeeID == x.PayeeID &&
                y.ProjectID == x.ProjectID))
        .ToList();

    var results = nonTemporalPaymentTerms;
    results.AddRange(toAdd);

    foreach (var result in results.OrderBy(x => x.PayeeID).ThenBy(x => x.CompanyID).ThenBy(x => x.ProjectID))
    {
        Console.WriteLine(
            $"PayeeID: {result.PayeeID}, CompanyID: {result.CompanyID}, ProjectID: {result.ProjectID}, IsTemporalPaymentTerm: {result.IsTemporalPaymentTerm}");
    }
}

推荐阅读