LINQ - 如何投影硬编码字符串中包含的对象?

时间:2018-01-29 17:12:25

标签: c# entity-framework linq

如何投影硬编码字符串中包含的对象?

我有这个查询,并且必须将MarcacaoFormularioMensagemRetificacao添加为硬编码字符串,因为它不是以前对象的属性:

 var query = db.Contacto.Where(c => c.idCidadao == idCidadao)   
    .SelectMany(c => c.Marcacao_Contacto)   
    .Select(mc => mc.Marcacao)  
    .Distinct()     
    .Where(m => m.id == idMarcacao && m.removida == false)  
    .Include(m => m.MarcacaoFormulario)     
    .Include("MarcacaoFormulario.MarcacaoFormularioMensagemRetificacao");

后来,我想将这个查询投影到我用硬编码字符串包含的那个类的对象列表中 - 我想出了类似的东西,但我只能使用所有先前对象的select语句来访问MarcacaoFormularioMensagemRetificacao对象,如下所示:

 var retorno = query
                     .Select(m => m.MarcacaoFormulario
                     .Select(mf => mf.MarcacaoFormularioMensagemRetificacao
                     .Select(mfmr => new MarcacaoFormularioMensagemRetificacao
                     {
                        id = mfmr.id,
                        idMarcacaoFormulario = mfmr.idMarcacaoFormulario,
                        mensagem = mfmr.mensagem,
                        resposta = mfmr.resposta
                     }).Where(mfmr => mfmr.resposta == null)));


         return retorno;

问题是,这不会返回MarcacaoFormularioMensagemRetificacao的列表,而是列表中的列表,列表中的列表,可能是因为连续的那些选择语句。 处理这个问题的正确方法是什么? 我正在使用EF 4.1,我想自从这个版本以来已经取得了一些进展。

List of list of list

1 个答案:

答案 0 :(得分:1)

您只需为Select更改SelectMany

var retorno = query
    .SelectMany(m => m.MarcacaoFormulario)
    .SelectMany(mf => mf.MarcacaoFormularioMensagemRetificacao)
    .Select(mfmr => new MarcacaoFormularioMensagemRetificacao
    {
       id = mfmr.id,
       idMarcacaoFormulario = mfmr.idMarcacaoFormulario,
       mensagem = mfmr.mensagem,
       resposta = mfmr.resposta
    })
    .Where(mfmr => mfmr.resposta == null)));

return retorno;

但似乎不需要第二个SelectMany。如果您发布了实际的课程,这将有所帮助。

这将为您提供IQueryable<MarcacaoFormularioMensagemRetificacao>。请注意,这不会执行查询(因此您最终会使用IQueryable。如果您想查询查询结果,请在结尾添加.ToList()