2009-01-05 11 views
48

एसक्यूएल में आप एक IsNull चला सकते हैं (शून्य, '') आप यह कैसे एक LINQ क्वेरी में करना होगा?LINQ में SQL ISNULL के समतुल्य?

मैं एक इस क्वेरी में शामिल होने की है:

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) कैसे मैं गलत पर सेट कर सकते हैं अगर यह मान शून्य होगा कि है कि है?

+3

आप "aa.Online" मतलब है? "xx" कहीं भी परिभाषित नहीं है ... –

उत्तर

55

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

अद्यतन; डाउनवोट के जवाब में, मैंने और जांच की है ... तथ्य यह है कि यह सही दृष्टिकोण है! यहाँ नॉर्थविंड पर एक उदाहरण है:

 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 

QED?

+0

प्रति दिन 200 से अधिक प्रतिनिधि रखना मुश्किल है!?!? हाँ सही। मैंने [System.Data.Linq.SqlClient.SqlMethods] (http://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.aspx) की जांच की है और यह सुनिश्चित करने के लिए कोई विधि नहीं है एसक्यूएल का 'ISNULL' उत्पादित किया गया है, इसलिए मैं आपके कोड का उपयोग करूँगा :-) – dumbledad

+0

ISNULL के साथ जॉइन करने के बारे में क्या? क्या वही काम काम करेगा? क्या ये ज़रूरी हैं? – Matt

+0

हाँ और मैंने कोशिश की और काफी करीब बंद कर दिया। इसने एक केस स्टेटमेंट बनाया, इसलिए जब मैंने इसे चलाया, तो यह बहुत अधिक डेटा लौटा। केस स्टेटमेंट को हटा दिए जाने के बाद, एसक्यूएल वापस आ गया ... माफ करना इसे कम करना पड़ा – Clarence

0

ऐसा लगता है कि प्रकार बूलियन है और इसलिए कभी भी शून्य नहीं हो सकता है और डिफ़ॉल्ट रूप से गलत होना चाहिए।

+1

यदि आप इसमें शामिल होने से डिफ़ॉल्ट रूप से इसे गलत बना सकते हैं? – MartGriff

+0

यह निश्चित रूप से डिफ़ॉल्ट रूप से गलत होगा? यह एक बूलियन है और सेट नहीं किया गया है, इसलिए यह गलत होना चाहिए। आप क्या देख रहे हो? –

23

आप डिफ़ॉल्ट मान सेट करने के ?? ऑपरेटर का उपयोग कर सकते हैं, लेकिन पहले आप आवश्यक फ़ील्ड में अपना dbml फ़ाइल में true को Nullable संपत्ति सेट करना होगा (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 
     }; 
1

मुझे अक्सर अनुक्रमों के साथ यह समस्या होती है (असतत मानों के विपरीत)। अगर मैं ints का एक क्रम है, और मैं उन्हें योग करने के लिए चाहते हैं, जब सूची खाली मैं त्रुटि "InvalidOperationException प्राप्त होगी: शून्य मान प्रकार System.Int32 साथ एक सदस्य को सौंपा नहीं जा सकता है जो गैर-व्यर्थ मूल्य है प्रकार।"।

मुझे लगता है कि मैं अनुक्रम को एक निरर्थक प्रकार में कास्ट करके हल कर सकता हूं। एसयूएम और अन्य कुल ऑपरेटर इस त्रुटि को फेंक नहीं देते हैं अगर शून्य प्रकारों का अनुक्रम खाली है।

इसलिए उदाहरण के लिए इस

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

की तरह कुछ

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

दूसरा एक 0 वापस आ जाएगी जब कोई भी पंक्ति जहां खंड से मेल हो जाता है। (जब कोई पंक्ति नहीं मिलती है तो पहला अपवाद अपवाद करता है)।