9

そのため、CTP4 コード ファースト機能を使用して Entity Framework 4 でモデルを作成しました。これはすべてうまく連携しています。

アプリケーションに高度な検索機能を追加しようとしています。この「高度な検索」機能により、ユーザーは複数の条件を入力して検索することができます。例えば:

高度な製品検索

  • 名前
  • 開始日
  • 終了日

これにより、ユーザーは製品名で検索し、作成された日付で結果を絞り込むことができます。

問題は、1 回の検索でこれらのフィールドがいくつ使用されるかわからないことです。では、Entity Framework クエリをどのように構築できますか?

Entity Framework の動的クエリを作成する方法を説明する例がありますが、Code First 永続化用に作成した POCO クラスでは機能しないようです。

制約の数が不明な場合にクエリを作成する最良の方法は何ですか?

4

2 に答える 2

20

したがって、この問題に数時間取り組んだ後 (そして私たちの友人である Google の助けを借りて)、私の問題に対する実行可能な解決策を見つけました。次の Linq 式拡張を作成しました。

using System;
using System.Linq;
using System.Linq.Expressions;

namespace MyCompany.MyApplication
{
    public static class LinqExtensions
    {
        public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate)
        {
            if (condition)
                return source.Where(predicate);
            else
                return source;
        }
    }
}

この拡張機能により、Linq クエリを次のように作成できます。

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name)
                               .WhereIf(startDate != null, p => p.CreatedDate >= startDate)
                               .WhereIf(endDate != null, p => p.CreatedDate <= endDate);

これにより、各 WhereIf ステートメントは、指定された条件を満たす場合にのみ結果に影響を与えることができます。解決策は機能しているようですが、私は常に新しいアイデアや建設的な批判を受け入れています。

于 2010-10-19T20:19:15.800 に答える
0

ジョン、

あなたのソリューションは絶対に素晴らしいです!しかし、共有するために、あなたの考えがわかるまで、私は上記の方法を使用してきました.

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword));

したがって、これは最善の解決策ではないようですが、確かに回避策です。

于 2014-02-10T14:39:15.547 に答える