2016-04-19 8 views
5

मैं इस उदाहरण जो मैं http://ef.readthedocs.org/en/latest/modeling/relationships.htmlकई-से-अनेक इकाई की रूपरेखा में क्वेरी 7

class MyContext : DbContext 
{ 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<Tag> Tags { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<PostTag>() 
      .HasKey(t => new { t.PostId, t.TagId }); 

     modelBuilder.Entity<PostTag>() 
      .HasOne(pt => pt.Post) 
      .WithMany(p => p.PostTags) 
      .HasForeignKey(pt => pt.PostId); 

     modelBuilder.Entity<PostTag>() 
      .HasOne(pt => pt.Tag) 
      .WithMany(t => t.PostTags) 
      .HasForeignKey(pt => pt.TagId); 
    } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public List<PostTag> PostTags { get; set; } 
} 

public class Tag 
{ 
    public string TagId { get; set; } 

    public List<PostTag> PostTags { get; set; } 
} 

public class PostTag 
{ 
    public int PostId { get; set; } 
    public Post Post { get; set; } 

    public string TagId { get; set; } 
    public Tag Tag { get; set; } 
} 

से मिला अब मेरे सवाल का कैसे मैं अपने क्वेरी पदों दिया करने के लिए TagId का निर्माण होता है अनुसरण कर रहा हूं? कुछ ऐसा:

public List<Post> GetPostsByTagId(int tagId) 
{ 
    //linq query here 
} 

कृपया ध्यान रखें कि यह ईएफ 7 है।

उत्तर

9

मेरी पहली सलाह शामिल करने के लिए ICollection<T> बजाय List<T> करने के लिए अपने संग्रह गुणों को बदलने के लिए अपनी DbContext का विस्तार कर सकते हैं। आप इस post में वास्तव में एक अच्छा स्पष्टीकरण पा सकते हैं।

अब वापस अपने वास्तविक समस्या के लिए जा रहा, यह कैसे मैं आपकी क्वेरी करना होगा है:

public List<Post> GetPostsByTadId(int tagId) 
{ 
    using(var context=new MyContext()) 
    { 
     return context.PostTags.Include(p=>p.Post) 
          .Where(pt=> pt.TagId == tagId) 
          .Select(pt=>pt.Post) 
          .ToList(); 
    } 
} 

आप क्योंकि EF7 आलसी लोड हो रहा है का समर्थन नहीं करता, और यह भी उत्सुक लोड करने के लिए Post नेविगेशन संपत्ति की आवश्यकता होगी के रूप में,

public DbSet<PostTags> PostTags { get; set; } 

स्पष्टीकरण::

@Igor उनके समाधान में सिफारिश की है, तो आप PostTags एक DbSet अपने संदर्भ में के रूप में शामिल होना चाहिए

आपकी क्वेरी PostTags तालिका में शुरू होती है क्योंकि उस तालिका में है जहां आप किसी विशिष्ट टैग से संबंधित सभी पोस्ट पा सकते हैं। देखें Post तालिका के साथ आंतरिक जुड़ने की तरह। यदि आप PostTags और PostsTagId द्वारा फ़िल्टरिंग के बीच एक जॉइन लागू करते हैं, तो आपको कॉलम प्राप्त होंगे। Select कॉल के साथ आप कॉल कर रहे हैं कि आपको केवल Post तालिका से कॉलम चाहिए।

यदि आप Include कॉल को हटाते हैं, तो यह अभी भी काम करना चाहिए। Include के साथ आप स्पष्ट रूप से कह रहे हैं कि आपको शामिल होने की आवश्यकता है, लेकिन Select के साथ, ईएफ का लिंक प्रदाता यह देखने के लिए पर्याप्त स्मार्ट है कि परिणामस्वरूप Posts कॉलम प्राप्त करने के लिए इसमें शामिल होने की आवश्यकता है।

+0

यह सुनिश्चित नहीं है कि यह कैसे काम करता है, क्योंकि मैं ईएफ के लिए नया हूं, लेकिन इस क्वेरी ने सबसे कुशल एसक्यूएल कथन बनाया है: 'पोस्टटैग इनर जॉइन पोस्ट ...' जहां अन्य उत्तरों के परिणामस्वरूप पूरी तरह से घृणित नेस्टेड सेक्शन का विवरण दिया गया है: 'पोस्ट से चुनें जहां (चयन करें जब EXISTS (पोस्टटैग से 1 चुनें ...क्या आप समझा सकते हैं कि क्या हो रहा है? –

+1

निश्चित रूप से, मैंने अपना जवाब अपडेट कर दिया है – octavioccl

0

यह वास्तव में ईएफ 7 के लिए विशिष्ट नहीं है।

आप PostTags

class MyContext : DbContext 
{ 
    public DbSet<PostTags> PostTags { get; set; } 

तो आपकी क्वेरी

db.Posts.Where(post => db.PostTags.Any(pt => pt.PostId == post.PostId && pt.TagId == tagId)) 
.Select(post => post); 
2
db.Posts.Where(post => post.PostTags.Any(pt => pt.TagId == tagId)); 
+0

यह काम करता है और शायद सबसे आसान समाधान है, लेकिन एसक्यूएल प्रोफाइलर को देखते हुए, इसने केस स्टेटमेंट और नेस्टेड चयन के साथ एक जटिल और अक्षम क्वेरी बनाई। सुनिश्चित नहीं है कि क्यों ... –

+0

@Wheelbuilder क्योंकि ईएफ कोर में अभी भी उचित LINQ-to-SQL अनुवाद की कमी है और गैर-सीधे अग्रवर्ती क्वेरी का अनुवाद SQL में नहीं किया गया है और इसलिए क्लाइंट पक्ष पर स्मृति में निष्पादित किया गया है जो छोटे छोटे SQL क्वेरी निष्पादित करता है। उदाहरण के लिए ग्रुप बाय के साथ ऐसा ही हो रहा है कि अब के लिए एसक्यूएल अनुवाद समर्थित नहीं है (यह तालिका में प्रत्येक प्रविष्टि के लिए सरल एसक्यूएल क्वेरी बनाता है) और केवल ईएफ कोर v1.1 में लागू होने की उम्मीद है और पूरी तरह से नहीं। –

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