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”子句的问题在于,如果条件为真,它会覆盖先前条件的结果。我想我需要一个“或”陈述或其他东西..

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 转换Contains为 SQL IN 运算符。

于 2013-10-21T07:56:48.110 回答
1

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

构建动态查询:

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 回答
0

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

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

或者如果是错误的,并且您想将 where 条件与多列一起应用,那么您可以尝试这样的事情

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

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

于 2013-10-21T07:49:29.943 回答