2012-03-25 10 views
67

EntityFrameworkを使用する新しいプロジェクトのコードファーストモデルを宣言しました。どこでDbQuery.Include()のオーバーロードにラムダがかかるのですか?

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 

EF v4.1以降ですが、拡張メソッドなので参照が必要です。


編集(@EastonJamesHarveyのおかげで)

EFコアを使用している場合、インポートは次のようになります。

using Microsoft.EntityFrameworkCore; 
+0

ありがとう!好奇心から、それはなぜ拡張メソッドであり、元のメソッドの単なるもう一つのオーバーロードではないのですか? – Timwi

+0

実際にはlolがADO.Netチームの質問になることは確かではありません –

+6

これはIQueryable の拡張メソッドなので、LINQクエリのどこでも使用できます。 DbQuery などでのみ定義されていた場合、.Where、.OrderByなどの別のメソッドを使用するとすぐに、これらのメソッドの戻り値の型がIQeryable であるため、メソッドが表示されなくなります。 –

関連する問題