2016-05-21 3 views
0

У меня есть следующие модели (комментарии определить поля внутри данного объекта)Linq GroupJoin выберите запрос

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} 

Чтобы получить все котировки по данному адресу, мне нужно присоединиться PackageID из "ПакетPackageId от . Таким образом, я буду знать, что эта цитата принадлежит этому адресу.

Я пробовал это, но я получаю сообщение об ошибке:

 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 (ы), которые идут в комплекте. Если ВСЕ товары ShippingItems в ShippingPackage имеют логический флаг «IsSkipped», установленный в true, цена Quote должна быть установлена ​​равной 0, в противном случае добавьте дополнительную цену в Quote.Price.

ВЫВОД:

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

Смежные вопросы