2008-09-01 19 views
13

अब LINQ से SQL एक छोटा अधिक परिपक्व है, मैं तकनीक का उपयोग करके एन-टायर समाधान बनाने के लिए उपयोग कर रहे किसी भी तकनीक के बारे में जानना चाहता हूं, क्योंकि यह मेरे लिए स्पष्ट नहीं लगता है।एन-टियर समाधान में LINQ से SQL का उपयोग कैसे करें?

उत्तर

1

LINQ से SQL में वास्तव में एक एन-स्तरीय कहानी नहीं है जिसे मैंने देखा है, क्योंकि यह जो वस्तुएं बनाता है, वह शेष वर्ग के साथ कक्षा में बनाई गई है, आपके पास वास्तव में कोई असेंबली नहीं है वेब सेवाओं, आदि जैसे कुछ अच्छी तरह से संदर्भित कर सकते हैं

एकमात्र तरीका जिसे मैं वास्तव में मानता हूं, डेटा डेटा लाने के लिए डेटाकॉन्टेक्स्ट का उपयोग कर रहा है, फिर मध्यस्थ डेटा मॉडल भरें, इसे पार कर, और दोनों तरफ संदर्भित करें, और इसका उपयोग अपने क्लाइंट साइड में कर रहे हैं - फिर उन्हें वापस भेजकर डेटा को वापस एक नए डेटाकॉन्टेक्स्ट में दबाएं या पंक्तियों को दोबारा अपडेट करने के बाद पंक्तियों को अपडेट करें।

अगर मैं समझ रहा हूँ तुम क्या करने की कोशिश कर रहे हैं यही कारण है कि: \

मैं ScottGu अपने ब्लॉग पर एक ही सवाल है जब मैं पहली बार इसे देख शुरू कर दिया पूछा - लेकिन मैं एक ही परिदृश्य नहीं देखा है या जंगली में ऐप जो इस तरह से LINQ से SQL का उपयोग करता है। रॉब कॉनरीज़ स्टोरफ्रंट जैसी वेबसाइटें प्रदाता के करीब हैं।

1

एचएम, Rockford Lhotka उदास, कि LINQ से SQL डेटाबेस से डेटा लाने के लिए अद्भुत तकनीक है। उन्होंने सुझाव दिया कि बाद में उन्हें "डोमेन ऑब्जेक्ट्स तक पहुंचने" (उर्फ सीएसएलए ओब्जेक्ट्स) से जुड़ना होगा।

गंभीरता से बोलते हुए, LINQ से SQL के पास एन-स्तरीय आर्किटेक्चर के लिए इसका समर्थन डेटाकॉन्टेक्स्ट देखें। विधि अद्यतन करें।

1

आप LINQ से SQL के विकल्प के रूप में ADO .Net Entity Framework को देखना चाहते हैं, हालांकि यह LINQ का भी समर्थन करता है। मेरा मानना ​​है कि LINQ से SQL को काफी हल्के और सरल होने के लिए डिज़ाइन किया गया है, जबकि एंटीटी फ्रेमवर्क अधिक भारी कर्तव्य है और शायद बड़े एंटरप्राइज़ अनुप्रयोगों में अधिक उपयुक्त है। दूसरे शब्दों में -

0

गंभीरता से बात करते हुए LINQ एसक्यूएल करने के लिए इसे n-स्तरीय संरचना के लिए समर्थन को देखने के DataContext.Update विधि

मैं क्या पढ़ा है पता चलता है कि व्यापार तर्क DataContext लपेटता में से कुछ है था आप जिस तरह से सुझाव देते हैं उसमें अद्यतन को लपेटें।

जिस तरह से मैं पारंपरिक रूप से व्यावसायिक वस्तुओं को लिखता हूं, मैं आम तौर पर बीओ में "लोड विधियों" को भी समाहित करता हूं; इसलिए मेरे पास LoadEmployeesAndManagers नामक एक विधि हो सकती है जो कर्मचारियों और उनके तत्काल प्रबंधकों की एक सूची लौटाती है (यह एक संक्षिप्त उदाहरण है)। शायद यह सिर्फ मुझे, लेकिन मेरे सामने के अंत में मैं कुछ लंबे LINQ कथन की तुलना में e.LoadEmployeesAndManagers() को देखना चाहूंगा।

वैसे भी

, LINQ का उपयोग कर यह शायद कुछ इस तरह (सिंटेक्स शुद्धता के लिए चयनित नहीं) दिखेगा: अब

var emps = from e in Employees 
       join m in Employees 
       on e.ManagerEmpID equals m.EmpID 
       select new 
          { e, 
          m.FullName 
          }; 

अगर मैं चीजों को सही ढंग से समझ, अगर मैं कहना एक वर्ग पुस्तकालय में रखते हैं और इसे से फोन मेरा फ्रंट एंड, मैं इसे वापस कर सकता हूं एकमात्र तरीका एक आईनेमरेबल के रूप में है, इसलिए मैं अपनी मजबूत टाइप की गई भलाई खो देता हूं। एकमात्र तरीका है कि मैं दृढ़ता से टाइप की गई वस्तु को वापस करने में सक्षम हूं, अपने स्वयं के कर्मचारी वर्ग (साथ ही प्रबंधक नाम के लिए एक स्ट्रिंग फ़ील्ड) बनाना होगा और इसे मेरे LINQ से SQL कथन के परिणामों से भरना होगा और फिर उसे वापस कर देना होगा। लेकिन यह काउंटर अंतर्ज्ञानी लगता है ... LINQ से SQL ने मुझे वास्तव में क्या किया है यदि मुझे यह सब करना है?

मुझे लगता है कि मैं चीजों को गलत तरीके से देख रहा हूं; किसी भी ज्ञान की सराहना की जाएगी।

0

"एक ही रास्ता है कि मैं इस लौट सकते हैं एक IEnumerable के रूप में है, इसलिए मैं अपने मजबूत टाइप अच्छाई खो"

कि सही नहीं है। वास्तव में आपकी क्वेरी दृढ़ता से टाइप की जाती है, यह सिर्फ एक अनाम प्रकार है। मुझे लगता है कि आप जो क्वेरी चाहते हैं वह अधिक है:

var emps = from e in Employees 
      join m in Employees 
      on e.ManagerEmpID equals m.EmpID 
      select new Employee 
         { e, 
         m.FullName 
         }; 

जो आईनेमेरेबल लौटाएगा।

यहां an article मैंने विषय पर लिखा है।

लिंक-टू-एसक्यूएल एक ओआरएम है। यह उस तरीके को प्रभावित नहीं करता है जिसे आप एन-टियर किए गए एप्लिकेशन को डिज़ाइन करते हैं। आप इसे उसी तरह इस्तेमाल करते हैं जैसे आप किसी अन्य ओआरएम का उपयोग करेंगे।

0

@liammclennan

कौन सा IEnumerable वापस आ जाएगी। ... लिंक-टू-एसक्यूएल एक ओआरएम है। यह उस तरीके को प्रभावित नहीं करता है जिसे आप एन-टियर किए गए एप्लिकेशन को डिज़ाइन करते हैं। आप इसे उसी तरह इस्तेमाल करते हैं जैसे आप किसी अन्य ओआरएम का उपयोग करेंगे।

तब मुझे लगता है कि मैं अभी भी उलझन में हूं। हां, लिंक-टू-एसक्यूएल एक ओआरएम है; लेकिन जहां तक ​​मैं कह सकता हूं कि मैं अभी भी इनलाइन एसक्यूएल प्रकार के बयान के साथ अपने फ्रंट एंड कोड को कूड़ा कर रहा हूं (linq, एसक्यूएल नहीं .... लेकिन फिर भी मुझे लगता है कि इसे सामने के अंत से दूर किया जाना चाहिए)।

मान लीजिए कि मैं LINQ कथन को लपेटता हूं जिसे हम एक विधि में उदाहरण के रूप में उपयोग कर रहे हैं।

public class EmployeesDAL 
{ 
    public IEnumerable LoadEmployeesAndManagers() 
    { 
      MyCompanyContext context = new MyCompanyContext(); 

      var emps = from e in context.Employees 
      join m in context.Employees 
      on e.ManagerEmpID equals m.EmpID 
      select new 
         { e, 
         m.FullName 
         }; 

      return emps; 
    } 

} 

मेरे सामने के छोर कोड से मैं कुछ इस तरह करना होगा::

EmployeesDAL dal = new EmployeesDAL; 
var emps = dal.LoadEmployeesAndManagers(); 
निश्चित रूप से

यह एक IEnumerable देता है जहां तक ​​मेरा बता सकते हैं, एक ही रास्ता मैं इसे वापस कर सकते हैं इस तरह से है ; लेकिन मैं किसी अन्य ORM की तरह उपयोग कर सकते हैं नहीं आप की तरह कहते हैं (जब तक कि बेशक मैं गलत), क्योंकि मैं ऐसा नहीं कर सकते (फिर से, यह एक काल्पनिक उदाहरण है):

txtEmployeeName.Text = emps[0].FullName 

यह है कि मैं क्या मैं "का मतलब है मजबूत टाइप की भलाई खोना। " मुझे लगता है कि मैं क्रूसिबल से सहमत होना शुरू कर रहा हूं; कि LINQ-to-SQL इस तरह से उपयोग करने के लिए डिज़ाइन नहीं किया गया था। दोबारा, अगर मैं चीजों को सही तरीके से नहीं देख रहा हूं, तो कोई मुझे रास्ता दिखाता है :)

1

ठीक है, मैं खुद को एक संभावित समाधान देने जा रहा हूं।

सम्मिलन/अपडेट कभी भी कोई समस्या नहीं थी; आप एक व्यापार/तर्क विधि में व्यापार तर्क लपेट सकते हैं; जैसे

public class EmployeesDAL 
{ 
    ... 
    SaveEmployee(Employee employee) 
    { 
     //data formatting 
     employee.FirstName = employee.FirstName.Trim(); 
     employee.LastName = employee.LastName.Trim(); 

     //business rules 
     if(employee.FirstName.Length > 0 && employee.LastName.Length > 0) 
     { 
      MyCompanyContext context = new MyCompanyContext(); 

      //insert 
      if(employee.empid == 0) 
      context.Employees.InsertOnSubmit(employee); 
      else 
      { 
       //update goes here 
      } 

      context.SubmitChanges(); 


     } 
     else 
      throw new BusinessRuleException("Employees must have first and last names"); 
    } 
} 
डेटा लाते समय के लिए

, या डेटा कि एक से अधिक तालिका से आ रहा है आप संग्रहित प्रक्रियाओं या दृश्यों का उपयोग कर सकते हैं क्योंकि परिणाम गुमनाम नहीं होगा ताकि आप उन्हें एक बाहर विधि से लौट सकते हैं कम से कम प्राप्त कर रहा है। उदाहरण के लिए, एक संग्रहित प्रो का उपयोग करके:

public ISingleResult<GetEmployeesAndManagersResult> LoadEmployeesAndManagers() 
    { 
     MyCompanyContext context = new MyCompanyContext(); 

     var emps = context.GetEmployeesAndManagers(); 

     return emps; 
    }