Pergunta

Vamos dizer que tenho duas tabelas:

  • Relatório
  • Comment

E supondo que eu tenho um contexto de banco de dados:

var reports = db.Reports();

Como posso ter certeza de todos os comentários para cada relatório são carregados assim?

Neste ponto eu quero desconexão do banco de dados, mas ainda ter acesso aos comentários. (Por exemplo:)

reports[0].Comments[0].Subject
Foi útil?

Solução

Estou assumindo que existe uma relação 1-M FK entre os relatórios e comentários (1 Relatório pode ter muitos comentários)?

Uma opção é usar os DataLoadOptions método .LoadWith - algo como o seguinte:

var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments);      // Ask for Comments along with reports
reports.LoadOptions = dlo;

Agora, cada vez que você selecionar um relatório sobre esse contexto de dados, os comentários será buscada a partir do db junto com ele.

Apenas cuidado para que todos os campos de comentários será selecionado -. Não há nenhuma maneira de usar este método para selecionar um subconjunto de campos

Outra opção é para ser específico sobre o que você quer selecionar na consulta Linq, por exemplo.

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 quando a consulta é executado ea conexão com o banco fechado, você precisa entender:

  • O modelo de execução diferida de Linq e LINQ to SQL (Basicamente, para LINQ to SQL, a consulta só é executado quando os resultados são pediu por exemplo, a iteração sobre a coleção ou ligação a uma rede)
  • A diferença entre IQueryable e IEnumerable

Jon Skeets "C # em profundidade" dá uma grande visão deles, e eu também ouvi coisas muito boas sobre "Linq em Ação" - e existem muitos posts sobre esses conceitos que fazem os assuntos mais justiça do que Eu posso fazer aqui; o)

Outras dicas

Keep in mind that if you use LoadOptions to define a multi-hop path (Reports, comments, anotherentity), the 3rd and further hops are loaded (if related over 1:n relationships) by code which is very inefficient: they'll execute one query per parent. For reports-comments, it's ok, they'll be fetched in 2 queries.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top