2012-03-25 25 views
67

EntityFramework kullanan yeni bir proje için bazı ilk kod modellerini bildirdim.DbQuery.Include() işlevi aşırı yüklenme, bir lambda alır?

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; } 
} 

Şimdi En son 10 blog girişlerini almak istediğinizi varsayalım:

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

sorun şimdi entry.Author erişen başka bir veritabanı sorgu neden olacaktır. Her blog girişi için ayrı bir sorgu istemezsiniz. Şimdi, Include amacı tam olarak bu durumda benim anlaşılmasıdır, bu yüzden söyleyebiliriz:

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

Ancak bu yöntem mevcut görünmüyor.

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

ancak kontrol zamanı derleme değil ve yeniden adlandırma üstlenmeden tarafından özleyeceğiz çünkü bu sinir bozucu: Orada sadece böyle bir Include(string) vardır. Elbette lambdalı versiyon “doğru” yaklaşımdır.

Bu yöntem nereye gitti? EntityFramework'da artık yer almıyor mu?

(Kendimi Bunu başarmak için sana gerek kalmaz. Ben sadece bir şey eksik olup olmadığını bilmek istiyorum, bir uzatma yöntemi yazabilirsiniz biliyoruz.)

cevap

98
using System.Data.Entity;//ftw 

EF v4.1 ve üzerindedir, ancak bir uzantı yöntemi olduğu için referansa ihtiyacınız vardır.


Düzenleme(@EastonJamesHarvey sayesinde)

EF Core'u kullanılıyorsa ithalat olmalıdır:

using Microsoft.EntityFrameworkCore; 
+0

teşekkürler! Yine de meraktan dolayı, neden bu bir uzantı yöntemi ve orijinal yöntemin başka bir aşırı yükü değil? – Timwi

+0

Aslında emin değilim ADO.Net ekibi için bir soru olurdu –

+6

IQueryable üzerinde bir uzantısı yöntemi, böylece bir LINQ sorgusunda herhangi bir yerde kullanabilirsiniz. Yalnızca DbQuery veya benzeriyle tanımlanmışsa, .Where, .OrderBy, vb. Gibi başka bir yöntem kullandıkça, bu yöntemlerin dönüş türü IQueryable olduğundan yöntemi göremezsiniz. –

İlgili konular