2016-05-21 15 views
0

は、私があるAddressIdの、そのアドレスを参照して、対応する引用のリストを取得する必要があります(PackageIdを介して)。この時点では、引用が既に設定されています。LINQのGroupJoin選択クエリ

Quote.PackageId = Package.PackageId 

INPUT:

が、私は "パッケージのPackageIDに参加する必要がある特定のアドレスのすべての引用符を取得するには3 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内のすべてのShippingItemにbooleanフラグ "IsSkipped"がtrueに設定されている場合は、QuoteのPriceを0に設定し、そうでない場合はQuote.Priceに余分なコストを追加します。

OUTPUT:

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

大歓迎任意のヘルプ。

答えて

0

私は仕事全体をしていませんでしたが、エラーなしでコンパイルして実行するものがありました。これは、あなたが正しい方向を指すようにする必要があります。

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; } 
    } 
} 
+0

あなたは何も参加していません。私は引用符でパッケージに参加する必要があります – BobSwanson

+0

私は投稿を更新して参加を行いました。 – jdweng

+0

これが助けになりました。感謝 – BobSwanson