2

データベースのデータを検索するために使用したい検索フォームがあります。検索ボックスには 4 つのチェックボックスと 1 つのテキストフィールドがあります。問題は、ユーザーが検索をフィルタリングするためにチェックするテキストボックスを事前に知らないことを考慮して、linqクエリをどのように作成するかです。私がこれまでに持っているものは次のとおりです。

[HttpPost]
public ActionResult search(string ulv, string bjorn, string jerv, string gaupe)
{
    var query = (from o in db.observasjonene select o);
    if (ulv != null)
    {
        query = query.Where(o => o.art == ulv);
    }
    if (bjorn != null)
    {
        query = query.Where(o => o.art == bjorn);
    }
    if (jerv != null)
    {
        query = query.Where(o => o.art == jerv);
    }
    if (gaupe != null)
    {
        query = query.Where(o => o.art == gaupe);
    }
    IEnumerable ls = query.ToList();
    return Json(ls, JsonRequestBehavior.AllowGet);      

}

「where」句の問題は、条件が真の場合、以前の条件の結果が上書きされることです。「or」ステートメントか何かが必要だと思います..

4

3 に答える 3

2

私があなたの質問を正しく理解していればart、提供された値のいずれかと等しいかどうかを確認してください。これらの値をコレクションに結合し、コレクションにart値が含まれているかどうかを確認できます。

var values = new [] { ulv, bjorn, jerv, game }.Where(v => v != null);
var query = from o in db.observasjonene
            where values.Contains(o.art)
            select o;

EF はContainsSQL IN 演算子に変換されます。

于 2013-10-21T07:56:48.110 に答える
1

この場合、次の 2 つのアプローチを使用します。

動的クエリを作成します。

var q = DB.Invoices.AsQueryable();

if (isPresented != null)
    q = q.Where(iv => iv.IsPresented == isPresented);

if (ID != null)
    q = q.Where(iv => iv.ID == ID.Value);
    ...........................
return from iv in q 
orderby iv.DueDate descending 
select iv;

Union を使用して検索結果を結合します。

var q1 = db.FeeInvoice.Where(fi => [QUERY1]));

 if (isPresented != null)
 {
     var q2 = db.FeeInvoice.Where(fi =>[QUERY2]));

     q1.Union(q2);
 }

 if (ID != null)
 {
     var q3 = db.FeeInvoice.Where(fi =>[QUERY3]);

     q1.Union(q3);
 }

...........................
于 2013-10-21T08:05:08.290 に答える