2012-03-25 13 views
67

मैंने एंटीटीफ्रेमवर्क का उपयोग करने वाली एक नई परियोजना के लिए कुछ कोड-प्रथम मॉडल घोषित किए हैं।DbQuery के अधिभार कहां शामिल किया गया था() जाओ कि एक लैम्ब्डा लेता है?

public class BlogEntry 
{ 
    public long Id { get; set; } 
    public long AuthorId { get; set; } 
    public DateTime PublishedStamp { get; set; } 
    public string Title { get; set; } 
    public string Text { get; set; } 

    public virtual User Author { get; set; } 
} 

public class User 
{ 
    public long Id { get; set; } 
    public string Email { get; set; } 
    // ... 
} 

class BlogDb : DbContext 
{ 
    public DbSet<BlogEntry> Entries { get; set; } 
    public DbSet<User> Users { get; set; } 
} 

अब मान लीजिए कि मैं 10 सबसे हाल ही में ब्लॉग प्रविष्टियों प्राप्त करना चाहते हैं:

var entries = new BlogDb().Entries.OrderByDescending(...).Take(10).ToList(); 

समस्या अब है कि तक पहुँचने entry.Author एक और डेटाबेस क्वेरी का कारण होगा। आप प्रत्येक ब्लॉग एंट्री के लिए एक अलग ऐसी क्वेरी नहीं चाहते हैं। अब, यह मेरी समझ है कि Include के प्रयोजन वास्तव में यह मामला है, इसलिए मैं कह सकता हूँ:

var entries = new BlogDb().Entries.Include(e => e.Author).(...).ToList(); 

हालांकि, उस विधि अस्तित्व के लिए प्रतीत नहीं होता। वहाँ केवल एक Include(string), इस तरह है:

var entries = new BlogDb().Entries.Include("Author").(...).ToList(); 

लेकिन इस वजह से यह संकलन समय नहीं है की जाँच की और नाम बदलने रिफैक्टरिंग द्वारा याद किया जाएगा कष्टप्रद है। निश्चित रूप से लैम्ब्डा वाला संस्करण "सही" दृष्टिकोण है।

यह विधि कहां गई? क्या यह अब EntityFramework में शामिल नहीं है?

(मुझे पता है कि मैं एक विस्तार विधि लिख सकते हैं अपने आप को इस लक्ष्य को हासिल करने के लिए है, तो आप की जरूरत नहीं है। मैं सिर्फ जानना चाहता हूँ कि मैं कुछ याद कर रहा हूँ चाहते हैं।)

उत्तर

98
using System.Data.Entity;//ftw 

यह ईएफ v4.1 और ऊपर है, लेकिन आपको एक संदर्भ की आवश्यकता है क्योंकि यह एक विस्तार विधि है। एफई कोर का उपयोग कर


संपादित(@EastonJamesHarvey करने के लिए धन्यवाद)

आयात किया जाना चाहिए:

using Microsoft.EntityFrameworkCore; 
+0

धन्यवाद! यद्यपि जिज्ञासा से, यह एक विस्तार विधि क्यों है और मूल विधि का बस एक और अधिभार नहीं है? – Timwi

+0

मुझे वास्तव में यकीन नहीं है कि एलओएल ADO.Net टीम –

+6

के लिए एक प्रश्न होगा। यह IQueryable पर एक विस्तार विधि है ताकि आप इसे LINQ क्वेरी में कहीं भी उपयोग कर सकें। यदि इसे केवल DbQuery या इसी तरह परिभाषित किया गया था, तो जैसे ही आप किसी अन्य विधि का उपयोग करते हैं जैसे कि .Where ,OrderBy, और इसी तरह, अब आप इस विधि को नहीं देख पाएंगे क्योंकि इन विधियों का रिटर्न प्रकार IQueryable है। –

संबंधित मुद्दे

 संबंधित मुद्दे