سؤال

في SQL يمكنك تشغيل ISNULL (خالية، '') كيف يمكنك أن تفعل هذا في استعلام 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
        };

ولكن لدي العمود الذي يحتوي على نوع الشيء الذي هو غير قيم الفارغة (xx.online) كيف يمكنني ضبط هذا إلى false إذا كان باطلا؟

هل كانت مفيدة؟

المحلول

ومنذ aa هو مجموعة / الكائن الذي قد يكون لاغيا، ويمكنك التحقق من aa == null؟

و(aa / xx قد تكون قابلة للتبديل (خطأ مطبعي في السؤال)؛ المحادثات السؤال الأصلي حول xx ولكنها تعرف فقط aa)

وأي بمعنى.

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

وأو إذا كنت تريد الافتراضي إلى أن false (لا 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);
            }
        }

وهنا هو TSQL - الى حد كبير ما نريد (أنها ليست ISNULL، ولكنه قريب بما فيه الكفاية):

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

وهو المطلوب؟

نصائح أخرى

ويمكنك استخدام المشغل ?? لتعيين القيمة الافتراضية ولكن أولا يجب عليك تعيين الخاصية Nullable إلى true في الخاص بك على DBML ملف في الحقل المطلوب (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
        };

وأنا غالبا ما يكون هذا مشكلة مع تسلسل (على العكس من القيم المنفصلة). إذا كان لدي سلسلة من [إينتس]، وأريد أن ألخص لهم، عندما كانت القائمة فارغة سوف تظهر رسالة الخطأ "InvalidOperationException: لا يمكن تعيين قيمة فارغة إلى عضو مع نوع System.Int32 التي هي قيمة غير قيم الفارغة اكتب ".

وأجد أنني يمكن أن تحل هذه من قبل الصب تسلسل إلى نوع قيم الفارغة. SUM وغيرها من مشغلي الاجمالية لا رمي هذا الخطأ إذا سلسلة من أنواع nullable فارغ.

وهكذا على سبيل المثال شيئا من هذا القبيل

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

ويصبح

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

ووالثاني سيعود 0 عندما تتطابق أية صفوف شرط مكان. (أول واحد يطرح استثناء عندما تتطابق أية صفوف).

ويبدو أن النوع هو منطقي، وبالتالي لا يمكن أن تكون لاغية وينبغي أن تكون كاذبة افتراضيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top