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に含まれていませんか?
は(私自身がこれを達成するために、私はあなたがする必要はありませんので。私はちょうど私が何かが欠けてるかどうかを知りたいのですが、拡張メソッドを書くことができることを知っている。)
ありがとう!好奇心から、それはなぜ拡張メソッドであり、元のメソッドの単なるもう一つのオーバーロードではないのですか? – Timwi
実際にはlolがADO.Netチームの質問になることは確かではありません –
これはIQueryableの拡張メソッドなので、LINQクエリのどこでも使用できます。 DbQuery などでのみ定義されていた場合、.Where、.OrderByなどの別のメソッドを使用するとすぐに、これらのメソッドの戻り値の型がIQeryable であるため、メソッドが表示されなくなります。 –