web-dev-qa-db-ja.com

Linq-to-EntitiesIncludeメソッドが見つかりません

MVC3アプリケーション内でEF4を使用しており、特定のワークグループ内のすべての連絡先を表示する方法を探していました。私が指定したコントローラーで:

var wg = from w in _repo.Workgroups.Include("Contact").ToList();

しかし、次のエラーが発生します。

'System.Linq.IQueryable'には、 'Include'の定義が含まれておらず、タイプ 'System.Linq.IQueryable'の最初の引数を受け入れる拡張メソッド 'Include'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか? ?)

この方法はEF4に組み込まれていますが。どういうわけかそれを有効にしましたか?

25
jdiaz

はい、メソッドは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 を使用する必要があります。

15
Ladislav Mrnka

また、このエラーが発生し、次の参照を追加することで解決しました。

using System.Data.Entity;
85
BruceHill

ブルースヒルの答えは絶対に正しいです。

彼の答えを少し拡張するために、IncludeメソッドはSystem.Data.Entity名前空間の拡張メソッドです。

使用方法には影響しませんが、Includeメソッドは実際にはDbExtensionsという名前の静的クラスで定義されています。 msdn.Microsoft.comでは、System.Linq.IQueryableの下ではなく、そこに文書化されているので、見つけるのが少し難しくなっています。

10
Dan K

この問題がストアドプロシージャに起因する場合は、SPが正常に機能していることを確認してください。

Entity Frameworkは、ストアドプロシージャからの戻り値の種類を予測しようとします。その中のテーブル名または列が無効なため、SPが機能しない場合は、整数を返し、Entity Frameworkは作成します。テーブルではなく戻り値として整数を期待する概念スキーマ。

0
Mahesh

私もこの問題に直面しており、次の参照を追加することでasp.netコア3.0プロジェクトで解決しました。

using Microsoft.EntityFrameworkCore; 
0
Sufyan Ahmad