Cuando se registros de tablas relacionadas cargados con LINQ2SQL
-
21-08-2019 - |
Pregunta
Vamos a decir que tengo dos tablas:
- Informe
- Comentario
Y suponiendo que tengo una base de datos de contexto:
var reports = db.Reports();
¿Cómo puedo asegurarme de que todos los comentarios para cada informe se cargan así?
En este punto quiero desconectar de la base de datos, pero todavía tener acceso a los comentarios. (Por ejemplo:)
reports[0].Comments[0].Subject
Solución
Estoy asumiendo que existe una relación 1-M FK entre los informes y comentarios (1 informe puede tener muchas Comentarios)?
Una opción es utilizar la DataLoadOptions método .LoadWith - algo como lo siguiente:
var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments); // Ask for Comments along with reports
reports.LoadOptions = dlo;
Ahora, cada vez que se selecciona un informe sobre los datos de ese contexto, los comentarios se fue a buscar desde el PP junto con él.
Sólo ten en cuenta que todos los campos de comentarios serán seleccionados -. No hay manera de utilizar este método para seleccionar un subconjunto de campos
Otra opción es ser específico acerca de lo que desea seleccionar en la consulta LINQ, por ejemplo.
var myReportsList = from report in db.Reports
select new { // Using anonymous type, but could use a custom class
Report = report,
Comment = report.Comment.Detail, // for example
Subject = report.Comment.Subject
};
Para entender cuando la consulta se ejecute y la conexión de base de datos cerrada, tendrá que entender:
- El modelo de ejecución diferida de LINQ y LINQ to SQL (Básicamente, para Linq a SQL, la consulta sólo se ejecuta cuando se pide a los resultados para por ejemplo iterando sobre la colección o unión a una rejilla)
- La diferencia entre IQueryable y IEnumerable
Jon Skeets "C # en profundidad" da una amplia visión de éstos, y también he oído cosas muy buenas de "LINQ en Acción" - además de que hay un montón de entradas de blog acerca de estos conceptos que hacen los sujetos más justicia que puedo hacer aquí; o)
Otros consejos
Tenga en cuenta que si utiliza LoadOptions para definir una ruta de múltiples saltos (informes, comentarios, anotherentity), la tercera y más saltos se cargan (si está relacionado con más de 1: n relaciones) con el código que es muy ineficiente: se 'll ejecutar una consulta por los padres. Para informes en los comentarios, que está bien, van a ser exagerado en 2 consultas.