MVC3アプリケーション内でEF4を使用しており、特定のワークグループ内のすべての連絡先を表示する方法を探していました。私が指定したコントローラーで:
var wg = from w in _repo.Workgroups.Include("Contact").ToList();
しかし、次のエラーが発生します。
'System.Linq.IQueryable'には、 'Include'の定義が含まれておらず、タイプ 'System.Linq.IQueryable'の最初の引数を受け入れる拡張メソッド 'Include'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか? ?)
この方法はEF4に組み込まれていますが。どういうわけかそれを有効にしましたか?
はい、メソッドはEFに組み込まれていますが、IQueryable
インターフェイスでは使用できません。 ObjectQuery
で入手できます。 IQueryable
で呼び出したい場合は、現在のクエリをObjectQuery
に変換し、Include
を実行する独自の拡張機能を作成する必要があります。何かのようなもの:
public static IQueryable<T> Include<T>(this IQueryable<T> query, string property)
{
var objectQuery = query as ObjectQuery<T>;
if (objectQuery == null)
{
throw new NotSupportedException("Include can be called only on ObjectQuery");
}
return objectQuery.Include(property);
}
または、そのような拡張機能がすでに利用可能な場合は、 Entity Framework Feature CTP5 を使用する必要があります。
また、このエラーが発生し、次の参照を追加することで解決しました。
using System.Data.Entity;
ブルースヒルの答えは絶対に正しいです。
彼の答えを少し拡張するために、IncludeメソッドはSystem.Data.Entity名前空間の拡張メソッドです。
使用方法には影響しませんが、Includeメソッドは実際にはDbExtensionsという名前の静的クラスで定義されています。 msdn.Microsoft.comでは、System.Linq.IQueryableの下ではなく、そこに文書化されているので、見つけるのが少し難しくなっています。
この問題がストアドプロシージャに起因する場合は、SPが正常に機能していることを確認してください。
Entity Frameworkは、ストアドプロシージャからの戻り値の種類を予測しようとします。その中のテーブル名または列が無効なため、SPが機能しない場合は、整数を返し、Entity Frameworkは作成します。テーブルではなく戻り値として整数を期待する概念スキーマ。
私もこの問題に直面しており、次の参照を追加することでasp.netコア3.0プロジェクトで解決しました。
using Microsoft.EntityFrameworkCore;