2016-09-22 42 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

相关问题