2016-11-25 4 views
-1

[OK]モデルでLINQ:LIST <>に複数のナビゲーションを設定する

、リード、他の特性の中で、我々はこれらの持っている:

public class Lead 
{ 
    .... 
    public int LeadID {get; set; } 
    public virtual ICollection<QuoteRevision> QuoteRevisions { get; set; } 
    .... 
} 

そしてQuoteRevisionを...

public class QuoteRevision 
{ 
    .... 
    [ForeignKey(nameof(LeadID))] 
    public virtual Lead Lead { get; set; } 

    public virtual ICollection<QuoteRevisionProduct> QuoteRevisionProduct{ get; set; } 
    .... 
} 

そしてQuoteRevisionProductのモデル:

public class QuoteRevisionProduct 
{ 
    .... 
    [ForeignKey(nameof(QuoteRevisionID))] 
    public virtual QuoteRevision QuoteRevision { get; set; } 

    [ForeignKey("ProductID")] 
    public virtual Product Product { get; set; } 
    .... 
} 

そして最後に...

public class Product 
{ 
    .... 
    public string Code { get; set; } 
    .... 
} 

これらは、複数のプロパティを持つQuoteSearchItemというオブジェクトを作成するためにクエリを行う必要があるモデルです。ここではそれらの2の:

public class QuoteSearchItem 
{ 
    .... 
    public LeadID {get; set; } 
    public List<string> Codes { get; set; } 
    .... 
} 

私がリード内のすべての行のこののIQueryableを始めている:

leads = IQueryable<Lead> 

そして、このやって:私はどのようにわからない

var results = from l in leads 
    from qr in l.QuoteRevisions 
    from rp in qr.RevisionProducts 
    select new QuoteSearchItem 
    { 
     .... 
     LeadID = l.LeadID, 
     AdditionalProducts = ??? 
     .... 
    }; 

をそのコードのリストを取得します。私はこれを行うことができます。

Code = rp.Product.Code, 

そして、それは私の単一のコードは、リストの最初を取得します。しかし、どうすれば一致するものが得られますか?

私はこれがたくさんあったことを知っています。それが理にかなってほしい。ありがとうございました!

EDIT:これは単に製品ごとに複数の行を返すことを除いて

SELECT 
    l.ID, 
    p.Code 
FROM 
    dbo.Leads AS l 
    JOIN QuoteRevisions qr ON qr.LeadID = l.ID 
    JOIN QuoteRevisionProducts qrp on qrp.QuoteRevisionID = qr.QuoteRevisionID 
    JOIN Products p on p.ProductID = qrp.ProductID 

これは(ほとんど)私が探しているSQLです。しかし、少なくともそれはアイデアを与える。

EDIT 2:

Code = l.QuoteRevisions.SelectMany(qr => qr.RevisionProducts).Select(p => p.Product.Code).ToList() 

これはエラーをスローしませんが、それは私が必要なものではありません各コード、のためにデータの行を返します。

+0

できません 'Codes = l.QuoteRevisions.SelectMany(qr => qr.SelectMany(qri => qri.QuoteRevisionProduct).Select(p => p.Code)' – KMoussa

+0

答えとして入れることはできますか?qr SelectManyはオプションではありませんが、あなたがどこに向かうのかを確認してください。 –

答えて

1

あなたがモデルを平らにし、すべてのコード、このような何かを得るためにSelectManyを使用することができます。

var results = from l in leads  
select new QuoteSearchItem 
{ 
    .... 
    LeadID = l.LeadID, 
    Codes = l.QuoteRevisions.SelectMany(qr => qr.QuoteRevisionProduct) 
      .Select(p => p.Product.Code) 
    .... 
}; 

ないあなたのDBがどのように見えるか確認していますが、おそらく重複Codes

を排除するだけでなく Distinctを使用することができます
+0

よろしくお願いします。 ghtの方向、qr.SelectMany(..)でコンパイルエラーが表示されます。QuoteRevisionsに 'SelectMany'の定義が含まれていません –

+0

はい、ちょうど更新されました。*は動作するはずですが、現時点ではテストできません。 – KMoussa

+0

ああ、近づいています!これだけではありませんが、私は遊び続けます。 –

関連する問題