Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

LINQ से SQL ले लो w/o छोड़ें एकाधिक SQL कथन का कारण बनता है

पहला - टेक बग के लिए कुछ तर्क।

अगर आप बस लें , क्वेरी अनुवादक केवल शीर्ष का उपयोग करता है। यदि चाइल्ड कलेक्शन में शामिल होने से कार्डिनैलिटी टूट जाती है तो Top10 सही उत्तर नहीं देगा। तो क्वेरी अनुवादक बाल संग्रह में शामिल नहीं होता है (बजाय यह बच्चों के लिए आवश्यक है)।

अगर आप छोड़ें और लें , फिर क्वेरी अनुवादक पैरेंट पंक्तियों पर कुछ RowNumber तर्क के साथ शुरू होता है... ये पंक्ति संख्याएँ इसे 10 माता-पिता लेने देती हैं, भले ही यह वास्तव में 50 रिकॉर्ड हों, क्योंकि प्रत्येक माता-पिता में 5 बच्चे होते हैं।

अगर आप छोड़ें(0) और लें , स्किप को अनुवादक द्वारा एक गैर-संचालन के रूप में हटा दिया जाता है - यह बिल्कुल वैसा ही है जैसा आपने कभी स्किप नहीं कहा था।

यह एक कठिन वैचारिक छलांग होगी जहां से आप (स्किप एंड टेक कहते हैं) से "सरल वर्कअराउंड" तक। हमें क्या करना है - अनुवाद को उस बिंदु पर होने के लिए मजबूर करना है जहां अनुवादक स्किप (0) को गैर-ऑपरेशन के रूप में नहीं हटा सकता है। हमें स्किप को कॉल करना होगा और बाद में स्किप किए गए नंबर की आपूर्ति करनी होगी।

DataClasses1DataContext myDC = new DataClasses1DataContext();
  //setting up log so we can see what's going on
myDC.Log = Console.Out;

  //hierarchical query - not important
var query = myDC.Options.Select(option => new{
  ID = option.ParentID,
  Others = myDC.Options.Select(option2 => new{
    ID = option2.ParentID
  })
});
  //request translation of the query!  Important!
var compQuery = System.Data.Linq.CompiledQuery
  .Compile<DataClasses1DataContext, int, int, System.Collections.IEnumerable>
  ( (dc, skip, take) => query.Skip(skip).Take(take) );

  //now run the query and specify that 0 rows are to be skipped.
compQuery.Invoke(myDC, 0, 10);

यह निम्नलिखित क्वेरी उत्पन्न करता है:

SELECT [t1].[ParentID], [t2].[ParentID] AS [ParentID2], (
    SELECT COUNT(*)
    FROM [dbo].[Option] AS [t3]
    ) AS [value]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ID]) AS [ROW_NUMBER], [t0].[ParentID]
    FROM [dbo].[Option] AS [t0]
    ) AS [t1]
LEFT OUTER JOIN [dbo].[Option] AS [t2] ON 1=1 
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p1 + @p2
ORDER BY [t1].[ROW_NUMBER], [t2].[ID]
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
-- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [10]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1

और यहीं पर हम जीतते हैं!

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p1 + @p2


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में टेबल-वैल्यूड फंक्शन क्या है?

  2. तालिका मान पैरामीटर को कैसे बदलें

  3. क्या हमारे पास एक विदेशी कुंजी हो सकती है जो किसी अन्य तालिका में प्राथमिक कुंजी नहीं है?

  4. SQL सर्वर में किसी दिनांक को छोटा करने का सबसे अच्छा तरीका क्या है?

  5. SQL सर्वर में राउंड (UP/DOWN) कैसे करें – 5 उपयोगी टिप्स