如何基于搜索标准创建动态linq查询

时间:2013-10-21 07:42:40

标签: c# linq

我有一个搜索表单,我想用它来搜索数据库中的数据。搜索框有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”子句的问题是如果条件为真,它将覆盖先前条件的结果。我想我需要一个“或”声明或其他东西..

3 个答案:

答案 0 :(得分: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将Contains转换为SQL IN运算符。

答案 1 :(得分:0)

您正在将所有参数值与查询中的单个列进行比较,即。 art (请参阅您在每个条件中都写了相同的列名)。我不确定你为什么这样做?您可以简单地使用单个参数来比较像这样的值

 public ActionResult search(string value)
 {
    query = query.Where(o => o.art == value);
 }

或者如果它是错误的并且您想要在多个列的情况下应用条件那么您可以尝试这样的事情

query=query.Where(o => (o.art == ulv || ulv == string.Empty) && (o => o.bjorn == bjorn || bjorn=string.empty) && (o.jerv == jerv || jerv == string.Empty) && (o.gaupe == gaupe || gaupe == string.Empty));

注意:我假设您的列名称为参数名称。

答案 2 :(得分:0)

在这种情况下,我使用两种方法:

构建动态查询:

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;

使用联盟组合搜索结果:

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);
 }

...........................