복붙노트

[SQL] LINQ에서 SQL ISNULL의 등가?

SQL

LINQ에서 SQL ISNULL의 등가?

SQL에서 당신이 ISNULL 실행할 수 있습니다 (널 (null)을, '') 당신은 어떻게 LINQ 쿼리에 이런 짓을 했을까?

나는이 쿼리에 합류 :

var hht = from x in db.HandheldAssets
        join a in db.HandheldDevInfos on x.AssetID equals a.DevName into DevInfo
        from aa in DevInfo.DefaultIfEmpty()
        select new
        {
        AssetID = x.AssetID,
        Status = xx.Online
        };

하지만 난 그게 널 (null) 인 경우 나 false로 설정하는 방법이 아닌 널 (NULL) (xx.online)는 비트 유형이 열을가?

해결법

  1. ==============================

    1.AA는 null이 될 수있는 세트 / 객체이기 때문에, 당신은 AA == 널 (null)을 확인할 수 있나요?

    AA는 null이 될 수있는 세트 / 객체이기 때문에, 당신은 AA == 널 (null)을 확인할 수 있나요?

    (AA / XX) 질문에 오타 (교환 할 수 있습니다; XX에 대한 원래의 질문 회담 만 AA 정의)

    select new {
        AssetID = x.AssetID,
        Status = aa == null ? (bool?)null : aa.Online; // a Nullable<bool>
    }
    

    당신이 원하는 경우 또는 기본 (NOT NULL) 거짓으로 :

    select new {
        AssetID = x.AssetID,
        Status = aa == null ? false : aa.Online;
    }
    

    최신 정보; downvote에 대한 응답으로, 좀 더 조사했습니다 ... 사실이다, 이것은 올바른 접근 방식입니다! 여기에 Northwind를에 예입니다 :

            using(var ctx = new DataClasses1DataContext())
            {
                ctx.Log = Console.Out;
                var qry = from boss in ctx.Employees
                          join grunt in ctx.Employees
                              on boss.EmployeeID equals grunt.ReportsTo into tree
                          from tmp in tree.DefaultIfEmpty()
                          select new
                                 {
                                     ID = boss.EmployeeID,
                                     Name = tmp == null ? "" : tmp.FirstName
                            };
                foreach(var row in qry)
                {
                    Console.WriteLine("{0}: {1}", row.ID, row.Name);
                }
            }
    

    : 거의 우리가 원하는 것을 (이 ISNULL 아니지만, 가까운 충분하다) - 그리고 여기 TSQL있어

    SELECT [t0].[EmployeeID] AS [ID],
        (CASE
            WHEN [t2].[test] IS NULL THEN CONVERT(NVarChar(10),@p0)
            ELSE [t2].[FirstName]
         END) AS [Name]
    FROM [dbo].[Employees] AS [t0]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t1].[FirstName], [t1].[ReportsTo]
        FROM [dbo].[Employees] AS [t1]
        ) AS [t2] ON ([t0].[EmployeeID]) = [t2].[ReportsTo]
    -- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
    -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
    

    QED?

  2. ==============================

    2.당신은을 사용할 수 있습니다 ?? 운영자가 기본 값을 설정하지만, 먼저 필요한 필드에 DBML 파일에서 true로 Null 허용 속성을 설정해야합니다 (xx.Online)

    당신은을 사용할 수 있습니다 ?? 운영자가 기본 값을 설정하지만, 먼저 필요한 필드에 DBML 파일에서 true로 Null 허용 속성을 설정해야합니다 (xx.Online)

    var hht = from x in db.HandheldAssets
            join a in db.HandheldDevInfos on x.AssetID equals a.DevName into DevInfo
            from aa in DevInfo.DefaultIfEmpty()
            select new
            {
            AssetID = x.AssetID,
            Status = xx.Online ?? false
            };
    
  3. ==============================

    3.나는 종종 (이산 값 반대) 시퀀스이 문제가 있습니다. 나는 INT의 순서를 가지고 있고, 나는 목록 내가 오류 "InvalidOperationException이 전송됩니다 비어 SUM 그들, 원하는 경우 : 널 (null) 값이 아닌 널 (NULL) 값이 유형 선택 System.Int32와 멤버에 할당 할 수 없습니다 유형.".

    나는 종종 (이산 값 반대) 시퀀스이 문제가 있습니다. 나는 INT의 순서를 가지고 있고, 나는 목록 내가 오류 "InvalidOperationException이 전송됩니다 비어 SUM 그들, 원하는 경우 : 널 (null) 값이 아닌 널 (NULL) 값이 유형 선택 System.Int32와 멤버에 할당 할 수 없습니다 유형.".

    나는 내가 nullable 형식으로 순서를 캐스팅함으로써이 문제를 해결할 수 있습니다 찾을 수 있습니다. nullable 형식의 시퀀스가 ​​비어 있으면 SUM 다른 집계 연산자는이 오류가 발생하지 않습니다.

    따라서이 같은 예를 들어 뭔가

    MySum = MyTable.Where(x => x.SomeCondtion).Sum(x => x.AnIntegerValue);
    

    가된다

    MySum = MyTable.Where(x => x.SomeCondtion).Sum(x => (int?) x.AnIntegerValue);
    

    행이 where 절과 일치하지 않는 경우 두 번째는 0으로 돌아갑니다. (행이 일치하지 않을 때 상기 제 한 예외가 발생).

  4. ==============================

    4.외모는 유형이 부울이므로 null이 될 수 없다 기본적으로 거짓이어야한다 좋아한다.

    외모는 유형이 부울이므로 null이 될 수 없다 기본적으로 거짓이어야한다 좋아한다.

  5. from https://stackoverflow.com/questions/413084/equivalent-of-sql-isnull-in-linq by cc-by-sa and MIT license