La sequenza locale non può essere utilizzata nell’implementazione LINQ to SQL degli operatori di query, ad eccezione dell’operatore Contains ()

Sto usando LINQ nel mio progetto e il mio codice è:

var SE = from c in Shop.Sections join c1 in obj.SectionObjects on c.SectionId equals c1.SectionId select c; dataGridView1.DataSource = SE; 

ma devo affrontare questo errore nella riga dataGridView1.DataSource = SE;
messaggio di errore è:

La sequenza locale non può essere utilizzata nell’implementazione LINQ to SQL degli operatori di query, ad eccezione dell’operatore Contains ().

Non è ansible utilizzare un join tra un’origine SQL e un’origine locale. Dovrai portare i dati SQL in memoria prima di poterli unire. In questo caso, non stai davvero facendo un join dato che prendi solo gli elementi dalla prima raccolta, quello che vuoi è un select … where … selectid in query, che puoi ottenere usando il metodo Contains.

  var SE = Shop.Sections.Where( s => obj.SectionObjects .Select( so => so.SectionId ) .Contains( s.SectionId )) .ToList(); 

Traduce a

 select * from Sections where sectionId in (...) 

dove i valori per la clausola in vengono dalla lista di id nella collezione di oggetti locali.

Non è ansible unire l’origine locale all’origine SQL, ma è ansible unire l’origine SQL al locale, vv

 var SE = from c1 in obj.SectionObjects join c in Shop.Sections on c1.SectionId equals c.SectionId select c; 

In altre parole, la fonte locale deve venire prima

Questo dovrebbe funzionare ed essere fatto dal lato del database (usando IN ), piuttosto che in memoria:

 var SE = from c in Shop.Sections where obj.SectionObjects.Select(z => z.SectionId).Contains(c.SectionId) select c; 

L2S Profiler è molto utile per questo genere di cose: puoi confrontare i diversi SQL generati dalla mia soluzione e altre soluzioni.

var SE = da c in Shop.Sections.AsEnumerable (). ToList () join c1 in obj.SectionObjects.AsEnumerable (). ToList () su c.SectionId equivale a c1.SectionId select c;

dataGridView1.DataSource = SE;