c# - 함수 - var query




가장 합리적인 SQL을 LINQ 쿼리로 왼쪽 조인을 가장 잘 표현하려면 어떻게해야합니까? (3)

이것은 완전한 대답은 아니지만 왼쪽 조인 조각에서 DefaultIfEmpty 연산자를 다음과 같이 사용할 수 있습니다.

var collection = 
from u in db.Universe
join history in db.History on u.id = history.id into temp
from h in temp.DefaultIfEmpty()
where h.dateCol < DateTime.Now.Date.AddDays(-1)
select u.id, u.name, h.dateCol ?? '1900-01-01'

아직 groupby 명령을 수행 할 필요가 없었으므로 잘못된 경로로 보내지 않도록 명령을 내 보냈습니다. 주목해야 할 두 가지 빠른 것들. 위에서와 같이 주위를 둘러 쌀 수있는 방법이 있지만 실제로 두 개의 매개 변수에 참여할 수 없습니다. 또한, ?? 연산자는 SQL에서 isnull 대신 실제로 작동합니다.

SQL :

SELECT
   u.id,
   u.name,
   isnull(MAX(h.dateCol), '1900-01-01') dateColWithDefault
FROM universe u
LEFT JOIN history h 
   ON u.id=h.id 
   AND h.dateCol<GETDATE()-1
GROUP BY u.Id, u.name

코드에 null 값을 처리하지 못하게하는 해결책은 다음과 같습니다.

DateTime yesterday = DateTime.Now.Date.AddDays (-1);

var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

이것은 정확히 동일한 SQL을 생성하지 않지만 동일한 논리적 결과를 제공합니다. "복잡한"SQL 쿼리를 LINQ로 변환하는 것이 항상 쉬운 것은 아닙니다.


var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

위의 코드를 사용하면 정상적으로 작동합니다.





left-join