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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top