with related multiple framework linq entity-framework include conditional

related - include with where clause in linq



condicional incluir en linq a las entidades? (5)

¿Estás seguro de que esto es lo que quieres? La única razón por la que pregunto es, una vez que agrega el filtro en las Partes fuera de los concesionarios, sus resultados ya no son concesionarios. Se trata de objetos especiales que, en su mayoría, están muy cerca de los concesionarios (con las mismas propiedades), pero el significado de la propiedad "Piezas" es diferente. En lugar de ser una relación entre concesionarios y repuestos, se trata de una relación filtrada.

O para decirlo de otra manera, si saco un concesionario de sus resultados y paso a un método que escribí, y luego en mi método llamo:

var count = dealership.Parts.Count();

Espero obtener las partes, no las partes filtradas de Brasil, donde el precio es de menos de $ 100.

Si no usa el objeto del concesionario para pasar los datos filtrados, se vuelve muy fácil. Se vuelve tan simple como:

var query = from d in dealerships select new { DealershipName = d.Name, CheapBrazilProducts = dealership.Parts.Where(d => d.parts.Any(p => p.price < 100.00) || d.parts.suppliers.Any(s => s.country == "brazil")) };

Si tan solo tuviera que obtener los conjuntos filtrados como me pidió, probablemente usaría la técnica que mencioné anteriormente, y luego usaré una herramienta como Automapper para copiar los resultados filtrados de mi clase anónima a la clase real. No es increíblemente elegante, pero debería funcionar.

¡Espero que eso ayude! Fue un problema interesante

Sentí que lo siguiente debería ser posible. No estoy seguro de qué enfoque tomar.

Lo que me gustaría hacer es utilizar el método de inclusión para dar forma a mis resultados, es decir, definir qué tan lejos debe atravesar el gráfico de objetos. pero ... me gustaría que ese cruce sea condicional.

something like... dealerships .include( d => d.parts.where(p => p.price < 100.00)) .include( d => d.parts.suppliers.where(s => s.country == "brazil"));

Entiendo que esto no es válido, de hecho, que está terriblemente mal, pero esencialmente estoy buscando una forma de construir un árbol de expresiones que devuelva resultados en forma, equivalentes a ...

select * from dealerships as d outer join parts as p on d.dealerid = p.dealerid and p.price < 100.00 outer join suppliers as s on p.partid = s.partid and s.country = ''brazil''

con énfasis en las condiciones de unión.

Siento que esto sería bastante directo con esql pero mi preferencia sería construir árboles de expresión sobre la marcha.

como siempre, agradecido por cualquier consejo u orientación


¿Me estoy perdiendo algo, o no estás buscando la palabra clave Any ?

var query = dealerships.Where(d => d.parts.Any(p => p.price < 100.00) || d.parts.suppliers.Any(s => s.country == "brazil"));


Esto debería funcionar:

using (TestEntities db = new TestEntities()) { var query = from d in db.Dealership select new { Dealer = d, Parts = d.Part.Where ( p => p.Price < 100.0 && p.Supplier.Country == "Brazil" ), Suppliers = d.Part.Select(p => p.Supplier) }; var dealers = query.ToArray().Select(o => o.Dealer); foreach (var dealer in dealers) { Console.WriteLine(dealer.Name); foreach (var part in dealer.Part) { Console.WriteLine(" " + part.PartId + ", " + part.Price); Console.WriteLine ( " " + part.Supplier.Name + ", " + part.Supplier.Country ); } } }

Este código le dará una lista de concesionarios que contienen una lista filtrada de partes. Cada parte hace referencia a un proveedor. La parte interesante es que debe crear los tipos anónimos en la selección en la forma que se muestra. De lo contrario, la propiedad de parte de los objetos del concesionario estará vacía.

Además, debe ejecutar la declaración de SQL antes de seleccionar los distribuidores de la consulta. De lo contrario, la propiedad de la parte de los distribuidores volverá a estar vacía. Es por eso que puse la llamada ToArray () en la siguiente línea:

var dealers = query.ToArray().Select(o => o.Dealer);

Pero estoy de acuerdo con Darren en que es posible que esto no sea lo que esperan los usuarios de su biblioteca.


Sé que esto puede funcionar con una sola inclusión. Nunca pruebe con dos inclusiones, pero vale la pena intentarlo:

dealerships .Include( d => d.parts) .Include( d => d.parts.suppliers) .Where(d => d.parts.All(p => p.price < 100.00) && d.parts.suppliers.All(s => s.country == "brazil"))


Sí, eso es lo que quería hacer. Creo que la próxima versión de Data Services tendrá la posibilidad de hacer solo esas consultas de LINQ a REST que serían geniales mientras tanto, acabo de cambiar para cargar la inversa e incluir la entidad relacionada que será cargado varias veces pero en teoría solo tiene que cargar una vez en el primer Incluir como en este código

return this.Context.SearchHistories.Include("Handle") .Where(sh => sh.SearchTerm.Contains(searchTerm) && sh.Timestamp > minDate && sh.Timestamp < maxDate);

antes de intentar cargar cualquier Handle the searchHistories que coincidiera con la lógica pero no sé cómo usar la lógica Include que escribiste, mientras tanto, creo que una búsqueda inversa sería una solución no tan sucia