2009-11-11 6 views
5

मैं कुछ समय के लिए अपने POCO ऑब्जेक्ट्स से पूछने के लिए LINQ का उपयोग कर रहा हूं, लेकिन मैंने अभी तक LINQ से SQL की कोशिश नहीं की है। मुझे लगता है कि LINQ से SQL क्वेरी किसी भी तरह से समकक्ष SQL क्वेरी में परिवर्तित हो जाती हैं और, यह देखते हुए, मुझे आश्चर्य है कि क्या LINQ से SQL क्वेरी के तरीके को प्रभावित किया जाता है या लिखा जाना चाहिए।LINQ से ऑब्जेक्ट्स और LINQ से SQL क्वेरीज़ के बीच अंतर

क्या LINQ से ऑब्जेक्ट्स और LINQ से SQL के बीच कोई महत्वपूर्ण अंतर है जो मुझे प्रभावित करता है कि मुझे किसी प्रश्न के लिए कैसे लिखना चाहिए?

+0

भी http://stackoverflow.com/questions/2388022/case-insensitive-string-compare-with-linq-to-sql-and-linq-to-objects –

उत्तर

3

मुख्य अंतर यह है कि आप कहते हैं कि LINQ से SQL क्वेरी SQL में परिवर्तित हो जाती हैं। इसका मतलब है कि वहां एक कोड है जिसे आप लिख सकते हैं जो वास्तव में परिवर्तनीय नहीं है या कुछ संक्षेप में अलग-अलग अर्थशास्त्र है - और आप इसे निष्पादन समय पर ही पाते हैं।

उदाहरण के लिए:

var query = from person in people 
      where person.Age == person.GetHashCode() 
      select person; 

ठीक संकलन होगा, लेकिन निष्पादन समय असफल क्योंकि LINQ एसक्यूएल के लिए क्या GetHashCode() से कोई लेना देना नहीं जानता है।

असल में मुझे LINQ से SQL को LINQ से ऑब्जेक्ट्स की भविष्यवाणी करने के लिए बहुत कठिन लगता है। यह कहना नहीं है कि यह उपयोगी नहीं है - यह सिर्फ थोड़ा अलग दुनिया है। एमएस ने आपको प्रश्न लिखने के लिए एक अद्भुत काम किया है जो अक्सर बस आप उन्हें क्या उम्मीद करते हैं, लेकिन यह सब कुछ नहीं कर सकता है।

2

LINQ से SQL, कॉलम डीबी सर्वर के कॉलम का उपयोग Where और OrderBy के लिए करेगा। LINQ से ऑब्जेक्ट्स स्ट्रिंग तुलना का उपयोग करेंगे। तो पूर्व मामला असंवेदनशील हो सकता है जबकि उत्तरार्द्ध केस-संवेदी है। LINQ से इकाइयों को nulls coalesces। मुझे लगता है कि एल 2 एस वही करता है, लेकिन मैंने परीक्षण नहीं किया है। तो L2E में आप कर सकते हैं:

let foo = item.Property.SomeNullableType 

... और foo अशक्त हो सकता है अगर संपत्ति रिक्त है। लेकिन LINQ से ऑब्जेक्ट्स में आपको कुछ ऐसा करना होगा:

let foo = item.Property != null ? item.Property.SomeNullableType : null 

... या आपको एक शून्य अपवाद मिलेगा।

+1

हाँ, LinqToSql भी nulls coalesces देखना । –

1

एमएसडीएन संदर्भ here और here आपकी मदद करनी चाहिए।

1

एक अंतर जो मैं चलाता हूं वह समूह में अंतर है।

जब आप वस्तुओं के लिए linq में समूह करते हैं, तो आपको श्रेणीबद्ध रूप से आकार का परिणाम मिलता है (चाबियाँ, बाल वस्तुओं के साथ)।

जब आप SQL में समूह करते हैं, तो आपको केवल कुंजी और योग मिलते हैं।

जब आप linq में sql में समूह करते हैं, तो यदि आप बच्चे के ऑब्जेक्ट्स (समेकित से अधिक) के लिए पूछते हैं, तो linq से sql प्रत्येक बच्चे को ऑब्जेक्ट प्राप्त करने के लिए कुंजी का उपयोग करके प्रत्येक समूह को दोबारा पूछेगा। यदि आपके पास हजारों समूह हैं, तो यह हजारों राउंडट्रिप्स हो सकते हैं।

//this is ok 
var results = db.Orders 
    .GroupBy(o => o.CustomerID) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderCount = g.Count() 
    }); 

//this could be a lot of round trips. 
var results = db.Orders 
    .GroupBy(o => o.CustomerID) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderIds = g.Select(o => o.OrderId) 
    }); 

// this is ok 
// used ToList to separate linqtosql work from linqtoObject work 
var results = db.Orders 
    .Select(o => new {o.CustomerId, o.OrderId}) 
    .ToList() 
    .GroupBy(o => o.CustomerId) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderIds = g.Select(o => o.OrderId) 
    });