2016-09-22 8 views
1

このコードのパフォーマンスと読みやすいコードを手助けできますか?別のクラスのサブリストに含まれるリスト内の要素を検索

public partial class Prodotti 
{ 
    public int IDProdotto { get; set; } 
    public List<string> SerialNumbers { get; set; } 
    public List<string> AllSerialNumbers 
    { 
     get 
     { 
      return cfgDb.getSerialByProduct(this.IDProdotto)     .Select(c => c.SerialNumber).ToList(); 
     } 

そしてprdIdxは一覧です:

var prd = new List<Prodotti>(); 
foreach (var prodotto in db.Prodotti) 
    foreach (var prdId in prdIdx)  
     if (prdId._idProdotto == prodotto.IDProdotto)   
      foreach (var prodottoSeriali in prodotto.AllSerialNumbers)    
       if (prdId.SerialNumber == prodottoSeriali) 
        if (prdId.SerialNumber == prodottoSeriali)         
           if (prd.Count(c => c.IDProdotto == prdId._idProdotto) == 1) 
            prd.Single(c => c.IDProdotto == prdId._idProdotto).SerialNumbers.Add(prdId.SerialNumber); 
           else 
           { 
            var tmpprd = new Prodotti() 
            { 
             IDProdotto = prodotto.IDProdotto, 
             ... 
             Descrizione = prodotto.Descrizione, 
            }; 
             tmpprd.SerialNumbers.Add(prdId.SerialNumber); 
            prd.Add(tmpprd); 
           } 
db.Prodotti

私は成功せず、LINQでそれを翻訳しようとしてい

public class cfgProdotti_Noleggio : cfgClass 
{ 
    public int idseriale { get; set; } 
    public int _idProdotto { get; set; } 
    public string SerialNumber { get; set; } 

var prd = db.Prodotti.ToList() 
Where(t2 => prdIdx.Any(t1 => t1._idProdotto== t2.IDProdotto)) 
.ToList(); 
+0

私はあなたがオブジェクトにあなたがEFを使用するか、これがLINQのですされていますhttp://codereview.stackexchange.com/ – Mahdi

+0

に投稿すべきだと思いますか? – octavioccl

+0

db.ProdottiはEFの生成クラスです – RazWorks

答えて

1

あなたはおそらくProdottのリストにSelectManyをしたいと思うでしょう私はそれを一つにする:

var l = db.Prodotti.SelectMany(p => p.SerialsNumbers). 

あなたはSerialNumbersのリストを持っています。ちょうどその時、あなたのprdIdxで、このリストの交差を作る:

var result = prdIdx.Select(m => m.SerialNumber).Intersect(l); 

結果varが共通のSerialNumberのIEnumerableをされ

注意(あなたがリストしたい場合.ToList()を呼び出し):未テストコードを

コメントに基づいて

var result = db.Prodotti.Where(p => prdIdx.Any(s => p.SerialsNumbers.Contains(s.SerialNumber)); 
+0

しかし、私はOPが望むのは、シリアル番号ではなく、コレクションまたはProdottiです。 – octavioccl

+0

@octavioccl、はい、prdIdxリストに割り当てられたserialnumberでフィルタリングされたProdottiのリストが必要です。 – RazWorks

+0

回答を編集して完全なオブジェクトを取得する – cdie

関連する問題