12

私は現在、EntityFrameworkを使用してASP.NETMVC4で検索関数を作成しています。しかし、私は「悪い」解決策しか見つけられない障害にぶつかりました。

私の検索関数は、4つのパラメーターで構成されるモデルを取得します。

String Name
String Street
String Code
String Province

List<Query> query = (from t in Model select t).ToList();

次に、検索入力でフィルタリングしたいと思います。ただし、ユーザーはできるだけ多くの検索フィールドに入力することを決定できます。彼は、名前と通り、または名前、通りと州、または...を使用することを決定できます。

私が見つけた唯一の実際の解決策は、クエリを作成しIQueryable、フィールドにが入力されているかどうかを確認してからif、を使用し.Whereてクエリを更新することです。これは現在m5のクエリを与えるので、私がここで見逃しているより良い解決策があるかどうか疑問に思っています。

私を助けてくれてありがとう。

4

4 に答える 4

22

私があなたが正しいと理解しているなら。あなたはこのようなものが欲しいかもしれません:

string Name;
string Street;
string Code;
string Province;
var query=(from t in Model select t);
if(Name!=null)
{
    query=query.Where (q =>q.Name==Name);
}
if(Street!=null)
{
    query=query.Where (q =>q.Street==Street);
}
if(Code!=null)
{
    query=query.Where (q =>q.Code==Code);
}
if(Province!=null)
{
    query=query.Where (q =>q.Province==Province);
}
List<Query> ls = query.ToList();

IQueryablewhereステートメントを追加すると、そのToList()sqlが実行されます。

アップデート

ルイス・エルナンデスのコメントに答える。これがその仕組みです。この場合、モデルから選択すると、コレクションタイプはIQueryableです。これは、データベースに対して実行されていないことを意味します。クエリを実行するには、最終的な方法のいくつかを適用する必要があります。linqにデータベース呼び出しを実際に実行することを通知します。これらは例えば

ToList()
FirstOrDefault()
SingleOrDefault()
Single()
First()
ToDictionary() 

したがって、を使用せずにWhere句を追加するとToList()。クエリの実行はありません。

LinqPadでクエリを試してください

于 2012-04-18T06:37:32.533 に答える
2

ここにあるエンティティ フィルター クラスを使用します: https://servicelayerhelpers.codeplex.com/SourceControl/changeset/view/32810#537055

最初にフィルターを指定してから、それをクエリに適用するだけです。

例:

var filter = EntityFilter
.Where(c => c.Name == came)
.Where(c => c.City == city);

var customers = FindCustomers(filter);

Customer[] FindCustomers(IEntityFilter filter)
{
var query = context.Customers;
query = filter.Filter(query);
return query.ToArray();
}

詳細: https://cuttingedge.it/blogs/steven/pivot/entry.php?id=66

于 2012-04-18T06:54:44.633 に答える
0

あなたはこのようなことを試すことができます

from cars in tblCars
where (cars.colorID == 1) && (cars.Wieght > 500) && (cars.Active == true)
select cars;
于 2012-04-18T06:53:53.300 に答える
0

もちろん、アリオンのソリューションは非常に優れています。リフレクションを使用して、繰り返しを少し減らしてみました。

        Type myType = myObject.GetType();
        IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

        foreach (PropertyInfo prop in props)
        {
            object propValue = prop.GetValue(myObject, null);
            if (propValue != null)
            {
                query = query.Where(q => prop.GetValue(q, null) == propValue);
            }
        }

編集:

すべてのプロパティで機能するように編集しました。もちろん、これが機能するためにはまだいくつかのことが必要ですが、それを使用する方法を理解したら、すべてのタイプに対してハードコーディングするのではなく、すべてのコードのユーティリティとして使用できます

于 2012-04-18T07:13:14.247 に答える