簡體   English   中英

Linq Group加入選擇查詢

[英]Linq GroupJoin select query

我有以下模型(注釋定義給定對象內的字段)

public class ServiceModel
{
    public List<ShippingRequest> ShippingRequest { get;  set; }
    public QuotesResult QuotesResult { get; set; }
}

public class ShippingRequest
{
    public Address Address { get; private set; }                    // AddressId
    public List<ShippingPackage> ShippingPackages { get; private set; }
}

public class ShippingPackage
{
    public Package Package { get; private set; }                    // PackageId
    public List<ShippingItem> ShippingItems { get;  private set; }  // IsSkipped
}

public class QuotesResult
{
    public List<Quote> Quotes { get; set; } // PackageId, Cost
}

假設我有以下輸入,我需要獲取一個AddressId列表以及引用該地址的相應引號(通過PackageId)。 此時,報價已被填充。

Quote.PackageId = Package.PackageId

輸入:

假設我在以下輸入中輸入了三個ShippingRequests

Address1 = {Package1, Package2, Package3}
Address2 = {Package5, Package8}
Address3 = {Package11, Package12}

為了讓所有的報價為給定的地址,我需要加入“ ”的包ID報價包標識 這樣,我便知道該報價單屬於該地址。

我已經試過了,但是出現錯誤:

        var addrQuotes = ServiceModel.ShippingRequest
            .GroupJoin(ServiceModel.QuotesResult.Quotes, c1 => c1.ShippingPackages
                .SelectMany(y => y.Package.Id), c2 => c2.PackageId, (c1, c2) =>
                    new {
                        c1.Address.Id,
                        Quotes = c2.Select(e =>
                        {
                            e.Price = c1.ShippingPackages.Any(
                                x => x.ShippingItems.All(y => y.IsSkipped))
                                ? 0
                                : e.Price + ExtraCost;
                            e.Provider = GetName(e.Code);
                            return e;
                        })
                    }).OrderBy(q => q.Id);

一個魚子醬是,我還需要檢查包裝中的ShippingItems。 如果ShippingPackage中的所有ShippingItems的布爾標志“ IsSkipped”均設置為true,則報價的價格應設置為0,否則將額外費用添加到Quote.Price。

輸出:

Address1 = [Quote1, Quote20, Quote21, Quote50, ...]
Address2 = [Quote3, Quote100...]
Address3 = [Quote5, Quote33, Quote12]

任何幫助,不勝感激。

我沒有完成全部工作,但是可以編譯並運行而沒有錯誤。 這應該使您指向正確的方向。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceModel serviceModel = new ServiceModel()
            {
                ShippingRequest = new List<ShippingRequest>(){
                    new ShippingRequest() {
                        Address = "Address 1",
                        ShippingPackages = new List<ShippingPackage>() {
                            new ShippingPackage() { Package = "Package1"}, 
                            new ShippingPackage() { Package = "Package2"}, 
                            new ShippingPackage() { Package = "Package3"}
                        }
                    },
                    new ShippingRequest() {
                        Address = "Address 2",
                        ShippingPackages = new List<ShippingPackage>() {
                            new ShippingPackage() { Package = "Package5"}, 
                            new ShippingPackage() { Package = "Package8"}, 
                        }
                    },
                    new ShippingRequest() {
                        Address = "Address 3",
                        ShippingPackages = new List<ShippingPackage>() {
                            new ShippingPackage() { Package = "Package11"}, 
                            new ShippingPackage() { Package = "Package12"}, 
                        }
                    }
                },
                QuotesResult = new QuotesResult()
                {
                    Quotes = new List<Quote>() {
                        new Quote() { Cost = 123, Id = "Package1"},
                        new Quote() { Cost = 123, Id = "Package2"},
                        new Quote() { Cost = 123, Id = "Package3"},
                        new Quote() { Cost = 123, Id = "Package11"},
                        new Quote() { Cost = 123, Id = "Package11"}
                    }
                }
            };

            var addrQuotes = (from requests in serviceModel.ShippingRequest.Select(x => x.ShippingPackages.Select(y =>  new { address = x.Address, package = y})).SelectMany(z => z)
                             join quote in serviceModel.QuotesResult.Quotes
                             on requests.package.Package equals quote.Id
                             select new { quote = quote, package = requests }).ToList();
            var results = addrQuotes.GroupBy(m => m.package.address)
               .Select(n => new {
                    quotes = n.Select(c => c).Select(c1 => new {
                     address = c1.package.address,
                     quote = c1.quote
                    }).ToList()
                }).ToList();

        }
    }

    public class ServiceModel
    {
        public List<ShippingRequest> ShippingRequest { get; set; }
        public QuotesResult QuotesResult { get; set; }
    }

    public class ShippingRequest
    {
        public string Address { get; set; }                    // AddressId
        public List<ShippingPackage> ShippingPackages { get; set; }
    }

    public class ShippingPackage
    {
        public string Package { get; set; }                    // PackageId
        public List<string> ShippingItems { get; set; }  // IsSkipped
    }

    public class QuotesResult
    {
        public List<Quote> Quotes { get; set; } // PackageId, Cost
    }
    public class Quote
    {
        public string Id { get; set; }
        public decimal Cost { get; set; }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM