2016-09-22 43 views
1

你能幫助我獲得更多的性能和更可讀的代碼,這段代碼列表元素?查找包含在另一個類的子列表

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:

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是一個列表:

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

我曾嘗試沒有成功將它與LINQ翻譯:

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

我想你應該張貼在http://codereview.stackexchange.com/ – Mahdi

+0

您是否使用EF或這是LINQ到對象? – 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); 

結果變種是常見的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過濾普羅多蒂的列表。 – RazWorks

+0

編輯回答檢索完整對象 – cdie

相關問題