0

Entity Framework 4.0 を使用して、次のようなコードが生成された 2 つの単純なエンティティを定義しました。

public partial class Person : EntityObject
{
   public string Name { ... generated code ... }
   public DateTime Birthday { ... generated code ... }
}

public partial class Sale : EntityObject
{
   public int ProductId { ... generated code ... }
   public DateTime DateSold { ... generated code ... }
}

この特定の例は不自然ですが、私が直面している実際の問題を表しています。多くの場合、私のコードでは、エンティティを特定の日付範囲に表示されるエンティティに制限したいと考えています。だから私は多くのインスタンスを持っています:

entities.Sales.Where(sale => sale.DateSold > startDate && sale.DateSold < endDate);

entities.People.Where(person => person.Birthday > startDate && person.Birthday < endDate);

これを処理できる一般的な方法を設定することは可能ですか? 何かのようなもの

entities.Sales.WithinRange(startDate, endDate);完璧であり、すべての拡張メソッドを設定できることはIQueryable<T>わかっていますが、共通コード内で WithinRange() メソッドを使用できるように柔軟性を持たせたいと考えています。例えば:

public static IQueryable<T> GetSortedNonNullObjectsInRange<T>(this IQueryable<T> data, DateTime startDate, DateTime endDate) where T : IHasDateDefined
{
   return data.Where(entity => entity != null).WhereInRange(startDate, endDate).OrderBy(entity => entity.Date);
}

共通のインターフェイス (IHasDateDefined など) を使用しようとすると、インターフェイスの Date プロパティが必要に応じて Birthday または DateSold を返しますが、Entity Framework は式を作成できないというエラーをスローします。

4

1 に答える 1

0

次の方法で目的を達成できると思います。

  • 次のシグネチャを使用して、エンティティ オブジェクトに静的メソッドを追加します。

  • .tt スクリプトを使用してコンテキストを拡張し、各テーブル (Person と Sale など) にメソッドが追加されるようにします。このメソッドは、追加された静的メソッドを使用してエンティティ オブジェクトの式を要求 IQueryable に追加します。実際、特定の IQueryable<...> 型に対する拡張メソッドを作成することもできます。

例。

Person クラスに追加されたメソッド:

Expression<Func<Person, bool>> CheckWithinRange (DateTime startDate, DateTime endDate) {
    return p => startDate <= p.Birthday && p.Birthday <= endDate;
}

IQueryable に追加された拡張メソッド

public IQueryable<Person> WithinRange(this IQueryable<Person> data, DateTime startDate, DateTime endDate) {
    return data.Where(Person.CheckWithinRange(startDate, endDate));
}

したがって、チェックしたいプロパティを返すプロパティを各クラスに追加する代わりに、チェックのロジックを各クラスに追加します。

于 2012-07-24T14:55:14.233 に答える