c# - studio - linq to sql vs entity framework
La secuencia local no se puede usar en la implementación LINQ to SQL de operadores de consultas, excepto el operador Contiene() (4)
Esto debería funcionar y hacerse en el lado de la base de datos (usando IN
), en lugar de en la memoria:
var SE = from c in Shop.Sections
where obj.SectionObjects.Select(z => z.SectionId).Contains(c.SectionId)
select c;
L2S Profiler es muy útil para este tipo de cosas: puede comparar los diferentes SQL generados por mi solución y otras soluciones.
Estoy usando LINQ en mi proyecto y mi código es:
var SE = from c in Shop.Sections
join c1 in obj.SectionObjects on c.SectionId equals c1.SectionId
select c;
dataGridView1.DataSource = SE;
pero enfrento este error en la línea dataGridView1.DataSource = SE;
el mensaje de error es:
La secuencia local no se puede usar en la implementación LINQ to SQL de operadores de consultas, excepto el operador Contiene ().
No puede usar una unión entre una fuente SQL y una fuente local. Tendrá que traer los datos SQL a la memoria antes de poder unirse a ellos. En este caso, en realidad no estás haciendo un join ya que solo tomas los elementos de la primera colección, lo que quieres es seleccionar ... donde ... selectid en query, que puedes obtener usando el método Contiene.
var SE = Shop.Sections.Where( s => obj.SectionObjects
.Select( so => so.SectionId )
.Contains( s.SectionId ))
.ToList();
Traduce a
select * from Sections where sectionId in (...)
donde los valores para la cláusula in provienen de la lista de identificadores en la colección de objetos locales.
No se puede unir fuente local a fuente SQL, pero PUEDE unir fuente SQL a local, vv
var SE = from c1 in obj.SectionObjects
join c in Shop.Sections on c1.SectionId equals c.SectionId
select c;
En otras palabras, la fuente local debe ser lo primero
var SE = desde c en Shop.Sections.AsEnumerable (). ToList () se une a c1 en obj.SectionObjects.AsEnumerable (). ToList () en c.SectionId es igual a c1.SectionId select c;
dataGridView1.DataSource = SE;