Как перевести SQL-запрос с подзапросом в select в запрос .NET Core - PullRequest
1 голос
/ 21 октября 2019

У меня есть следующий собственный запрос SQL:

select 
    a.id_agente,
    a.alias,
    a.direccion,
    cd.description, 
    (   select te.data 
        from tevento te 
        left join tagente ta on ta.id_agente = te.id_agente 
        where ta.id_agente = a.id_agente order by timestamp desc limit 1
    ) as data
from tagente a 
left join tagent_custom_data cd on a.id_agente = cd.id_agent 
where cd.id_field = 6 and cd.description = $VAR;

У меня есть этот запрос в ядре .net в контроллере, подобном этому:

    [HttpGet]
    public ActionResult<string> GetAgentesByPlanta(string idPlanta)
    {
        using (var db = new MyContext())
        {
            List<Object> lst = new List<Object>();

            var q =
                from a in db.Agente
                join cd in db.CustomData on a.id_agente equals cd.id_agent 
                where ((cd.id_field == 6) & (cd.description == idPlanta))
                select new { Agente = a, CustomData = cd };

            foreach (var x in q)
            {
                lst.Add(new {
                    id_agente=x.Agente.id_agente,
                    nombre=x.Agente.nombre,
                    direccion=x.Agente.direccion,
                    alias=x.Agente.alias,
                    ultimo_contacto=x.Agente.ultimo_contacto
                });
            }

            dynamic response = lst;

        return Ok(response);
        }
    }

Этот контроллер отвечает с помощью json иэто работает. Но, как вы можете видеть, подзапрос select отсутствует.

¿Как добавить подзапрос в этот запрос .NET Core?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вы можете использовать Eager Loading здесь, изменяя @baquilare ответ немного для образца

 var q =   from a in db.Agente
                join cd in db.CustomData on a.id_agente equals cd.id_agent 
                join te in db.Evento.AsQueryable().Include(x=>x.Agente) on
                  te.Agente.id_agente == a.id_agente
                where ((cd.id_field == 6) && (cd.description == idConvert))
                select new { 
                             Agente = a, 
                             CustomData = cd,
                             Evento =te.OrderByDescending(x=>x.timestamp).FirstOrDefault()
                };

Здесь я не знаю, отметка времени в какой таблице + она более оптимизирована, чем текущий код, но может бытьулучшилось намного ... простой совет, используя ef или efcore, я всегда буду советовать использовать шаблон репозитория, который вам может понадобиться system.Linq namespace тоже

также вы можете использовать sp, если не строгое по efcoreи выполнить его через efcore, что лучше для таких запросов

0 голосов
/ 21 октября 2019

Я наконец решил это сомнение следующим образом:

             var q =
                from a in db.Agente
                join cd in db.CustomData on a.id_agente equals cd.id_agent 
                where ((cd.id_field == 6) && (cd.description == idConvert))
                select new { 
                    Agente = a, 
                    CustomData = cd,
                    Evento = (from te in db.Evento
                            join ta in db.Agente on te.id_agente equals ta.id_agente
                            where ta.id_agente == a.id_agente
                            orderby te.timestamp descending
                            select new {Evento = te}).First()
                };

            foreach (var x in q)
            {
                lst.Add(new {
                    id_agente=x.Agente.id_agente,
                    nombre=x.Agente.nombre,
                    direccion=x.Agente.direccion,
                    alias=x.Agente.alias,
                    ultimo_contacto=x.Agente.ultimo_contacto,
                    data=x.Evento.Evento.data,
                    ultimo_data=x.Evento.Evento.timestamp
                });
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...