मैं लिंककैड में प्रश्नों के साथ प्रयोग कर रहा हूं। हमारे पास एक है एक कॉलम Side char(1)
साथ तालिका Lot
। जब मैं एसक्यूएल क्वेरी Lots.Where(l => l.Side == 'A')
करने के लिए एक LINQ लिखते हैं, यह निम्नलिखित एसक्यूएल का उत्पादनकहां से उत्पन्न विभिन्न एसक्यूएल (एल => l.Side == 'ए') बनाम कहां (एल => l.Side.Equals ('ए')
-- Region Parameters
DECLARE @p0 Int = 65
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE UNICODE([t0].[Side]) = @p0
हालांकि, Lots.Where(l => l.Side.Equals('A'))
का उपयोग कर, यह
-- Region Parameters
DECLARE @p0 Char(1) = 'A'
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE [t0].[Side] = @p0
यह पर प्रकट होता पैदा करता है (भोली यद्यपि) निरीक्षण, कि उत्तरार्द्ध मामूली तेजी से होगा, जैसा कि यह करता है UNICODE
पर कॉल की आवश्यकता नहीं है।
int
, smallint
या varchar
कॉलम वहाँ ==
या .Equals
के साथ उत्पादन एसक्यूएल के बीच कोई अंतर नहीं है का उपयोग करना, क्यों char(1)
है और इसी सी # प्रकार char
अलग है?
क्या यह अनुमान लगाने का कोई तरीका है कि दिया गया कॉलम प्रकार समानता जांच के दो रूपों के साथ अलग SQL उत्पन्न करेगा या नहीं?
संपादित करें:
मैं हर प्रकार एमएस एसक्यूएल द्वारा समर्थित जाँच कर ली है, और केवल char(1)
और nchar(1)
इस व्यवहार प्रदर्शित करते हैं। दोनों को System.Char
प्रकार द्वारा LinqToSql में दर्शाया गया है। यदि यह एक जानबूझकर निर्णय था, तो मैं binary(1)
पर समान व्यवहार है, जो System.Byte
द्वारा प्रतिनिधित्व किया जा सकता है (लेकिन इसके बजाय 1
की लंबाई के साथ System.Linq.Binary
है उम्मीद है |
संपादित करें 2:। मामले में यह प्रासंगिक है, मैं कर रहा हूँ LINQPad का उपयोग कर बनाई एसक्यूएल देखने पर मैं यह सोचते था LINQPad सिस्टम के LinqToSql का प्रयोग करेंगे, लेकिन मैं आज महसूस किया कि कि इस धारणा त्रुटिपूर्ण किया जा सकता है
संपादित करें 3:।। मैं परियोजना वी.एस. एक त्वरित प्रणाली LinqToSql परीक्षण करने के लिए भाग गया, और हम एक ही परिणाम प्राप्त करें:
कोड:
static void Main(string[] args)
{
var db = new DataClasses1DataContext {Log = Console.Out};
Console.Out.WriteLine("l.Side == 'A'");
Console.Out.WriteLine("=============");
Console.Out.WriteLine();
foreach (Lot ll in db.Lots.Where(l => l.Side == 'A'))
{
break;
}
Console.Out.WriteLine();
Console.Out.WriteLine("---------------------------------------");
Console.Out.WriteLine();
Console.Out.WriteLine("l.Side.Equals('A')");
Console.Out.WriteLine("==================");
Console.Out.WriteLine();
foreach (Lot ll in db.Lots.Where(l => l.Side.Equals('A')))
{
break;
}
Console.In.Read();
}
आउटपुट:
l.Side == 'A'
=============
SELECT ..., [t0].[Side], ...
FROM [dbo].[Lot] AS [t0]
WHERE UNICODE([t0].[Side]) = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [65]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.6.1532.0
---------------------------------------
l.Side.Equals('A')
==================
SELECT ..., [t0].[Side], ...
FROM [dbo].[Lot] AS [t0]
WHERE [t0].[Side] = @p0
-- @p0: Input Char (Size = 1; Prec = 0; Scale = 0) [A]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.6.1532.0
यह ध्यान रखें कि == 'A'
संस्करण में, पैरामीटर, एक int
के रूप में पारित हो जाता है, जबकि .Equals
संस्करण में, यह char
के रूप में पारित हो जाता है दिलचस्प है।
The dbml and table creation script are in this gist.
क्या आप डीबीएमएल मैपिंग पोस्ट कर सकते हैं? – usr
@usr यह LINQPad के माध्यम से था, जिसके लिए मुझे नहीं पता कि मानचित्रण को कैसे पुनर्प्राप्त किया जाए। – RoadieRich