source

하위 쿼리를 사용하여 SQL 쿼리를 변환하는 방법을 선택합니다.NET Core 쿼리

manysource 2023. 7. 24. 22:35

하위 쿼리를 사용하여 SQL 쿼리를 변환하는 방법을 선택합니다.NET Core 쿼리

다음 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 core에 다음과 같은 쿼리가 있습니다.

    [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 쿼리?

샘플에 대한 @baqilare 답변을 조금 수정하려면 여기에서 EagerLoading을 사용할 수 있습니다.

 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()
                };

여기서 다시 타임스탬프가 어떤 테이블에 있는지 모르겠습니다 + 현재 코드보다 더 최적화되었지만 많이 개선될 수 있습니다... efcore를 사용하는 간단한 조언입니다. 시스템이 필요할 수 있는 리포지토리 패턴을 사용하도록 항상 조언하겠습니다.Linq 네임스페이스도

또한 efcore에서 엄격하지 않다면 sp를 사용할 수 있고 efcore를 통해 실행할 수 있습니다. 이 경우와 같은 쿼리에 더 적합합니다.

저는 마침내 이 의문을 다음과 같은 방법으로 해결했습니다.

             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
                });
            }

언급URL : https://stackoverflow.com/questions/58483103/how-to-translate-a-sql-query-with-subquery-in-select-to-net-core-query