2014-12-04 10 views
5

Sto lavorando a un progetto che utilizza il framework di entità. Voglio una cosa semplice quando le persone fanno clic sul pulsante searchLookUpedit Voglio mostrare i valori filtrati in base alle società esistenti negli ordini. Quindi, ecco il codice:Assegnazione di più criteri di tipo <int> utilizzando linq in Entity Framework

private void SearchLookUpEdit_Customer_Click(object sender, EventArgs e) 
{ 
    object [] siparisNo = new object[gridView1.RowCount]; 
    List<Siparisler> siparisList = new List<Siparisler>(); 
    List<int> firmaIds = new List<int>(); 

    for (int i = 0; i < gridView1.RowCount; i++) 
    { 
     siparisNo[i] = gridView1.GetRowCellValue(i,"SiparisNo"); 
     int sipNo = Convert.ToInt32(siparisNo[i]); 
     Siparisler siparis = context.Siparisler.Where(p => p.Id == sipNo).FirstOrDefault(); 
     siparisList.Add(siparis); 
     firmaIds.Add(siparis.Firma_Id); 
    } 

    for (int i = 0; i < firmaIds.Count; i++) 
    { 
     int a = firmaIds[i]; 
     firmalarBindingSource.DataSource = context.Firmalar.Where(p => p.Id ==); 
    } 
} 

Qui per secondo ciclo. Immaginiamo che nel tipo di lista firmaIds<int> abbiano 3 valori. E supponiamo che siano 3, 5 e 8 per esempio, e voglio che solo queste 3 Aziende esisteranno nel firmalarBindingSource.DataSource dopo che l'evento click è terminato. Ci ho provato ma non è stato così. Se i miei criteri erano diversi, era facile filtrare. C'è un modo per fare questo?

risposta

4

Se ho capito quello che stai chiedendo provare a sostituire

for (int i = 0; i < firmaIds.Count; i++) 
{ 
    int a = firmaIds[i]; 
    firmalarBindingSource.DataSource = context.Firmalar.Where(p => p.Id ==); 
} 

con

firmalarBindingSource.DataSource = context.Firmalar.Where(p => firmaIds.Contains(p.Id)); 
+1

Sì! Questo è quello che voglio esattamente. Grazie a tutti. Grazie per gli sforzi :) Funziona perfettamente – husonos

+0

Felice di aiutarti :) – faby

2

@Faby risposto alla tua domanda, ma volevo solo aggiungere che si può anche ottimizzare la prima parte del il tuo codice, in modo che tu possa fare tutto in due righe di codice in modo più funzionale usando Linq:

IEnumerable<Firmalar> firmalarDataSource = Enumerable.Range(0, gridView1.RowCount - 1) 
    .Select((index) => 
    { 
     var siparisId = Convert.ToInt32(gridView1.GetRowCellValue(index, "SiparisNo")); 
     var siparis = context.Siparisler.FirstOrDefault(p => p.Id == siparisId); 
     return context.Firmalar.FirstOrDefault(f => f.Id == siparis.Firma_Id); 

    }) 
    .Distinct(); 

firmalarBindingSource.DataSource = firmalarDataSource; 

Nota: si tratta di due linee, ma ho regolato la formattazione per essere più leggibile;)

Se il valore delle prestazioni su linee di codice, ecco un esempio tre linea con meno andata e ritorno al DB:

var siparisIds = Enumerable.Range(0, gridView1.RowCount - 1) 
    .Select(index => Convert.ToInt32(gridView1.GetRowCellValue(index, "SiparisNo"))); 

var firmaIds = context.Siparisler.Where(p => siparisIds.Contains(p.Id)).Select(s => s.Firma_Id).Distinct(); 

firmalarBindingSource.DataSource = context.Firmalar.Where(f => firmaIds.Contains(f.Id)); 
+1

Sì, il tuo metodo funziona più velocemente ed è meglio. Usiamo questo per ottenere un po 'più di prestazioni. Grazie a tutti voi con i miei saluti :) – husonos

+0

siete i benvenuti;) –

Problemi correlati