C# 如果我不确定要匹配哪些属性,如何向LINQ查询添加Where表达式?

C# 如果我不确定要匹配哪些属性,如何向LINQ查询添加Where表达式?,c#,asp.net,linq,C#,Asp.net,Linq,我可能需要按订单号或名称进行搜索。我知道我可以将Where表达式添加到我的LINQ查询中,但我只想为我正在搜索的属性添加它!在调用该方法之前,我不知道将提供哪个参数,因此如何添加适当的条件 public JsonResult Search(int orderNo=0, string firstName="", string lastName="") { if (orderNo >0){ //add Condition } if (firstName

我可能需要按订单号或名称进行搜索。我知道我可以将Where表达式添加到我的LINQ查询中,但我只想为我正在搜索的属性添加它!在调用该方法之前,我不知道将提供哪个参数,因此如何添加适当的条件

public JsonResult Search(int orderNo=0, string firstName="", string lastName="")
{
    if (orderNo >0){
        //add Condition
    }

    if (firstName.Length > 0){
        //add Condition
    }

    if (lastName.Length > 0){
        //add Condition
    }

    //get Result

    var result = Repository.Orders.Where(???).OrderByDescending(e=> e.orderNo);

    //return
}

假设您的存储库返回IQueryable,您可以按照以下方式编写查询:

var query = Repository.Orders;
if(orderNo > 0)
{
    query = query.Where( x => x.OrderId == orderNo);
}

if(firstName.Length > 0)
{
   query = query.Where( x => x.FirstName == firstName);
}
//...

以下假设Repository.Orders返回IQueryable,但其目的只是动态添加所需的表达式。这样,您就可以在实际询问结果之前系统地构建它

// You haven't executed the query yet, you can still build up what you need
var query = Repository.Orders;

if(orderNo >0){
    // You STILL haven't actually executed the query.
    query.Where(x => x.orderNo == orderNo);
}
if(firstName.Length > 0){
    query.Where(x => x.firstname == firstName);
}
if(lastName.Length > 0){
    query.Where(x => x.lastName == lastName);
}

// Even with this, you STILL aren't actually executing the query.
query.OrderByDescending(x => x.orderNo);

// You'll be executing and enumerating the results here, but that's OK because you've fully defined what you want.
return Json(query.ToArray(), JsonRequestBehavior.AllowGet);

@Amit_g的例子也会起作用,而且可以说更容易阅读。我喜欢在一个查询中完成这一切。这是偏好的问题

如果必须和这些条件结合,并假设存储库返回,如果不更改它或添加另一个重载或其他内容

var query = Repository.Orders

// Build where clause

if (orderNo >0){
    query = query.Where(o => o.OrderNo == orderNo);
}

if (firstName.Length > 0){
    query = query.Where(o => o.FirstName == firstName);
}

if (lastName.Length > 0){
    query = query.Where(o => o.LastName == lastName);
}

// Build OrderBy clause

query = query.OrderByDescending(o => o.orderNo);

// Execute Query

results = query.ToList();
尝试
var query = Repository.Orders

// Build where clause

if (orderNo >0){
    query = query.Where(o => o.OrderNo == orderNo);
}

if (firstName.Length > 0){
    query = query.Where(o => o.FirstName == firstName);
}

if (lastName.Length > 0){
    query = query.Where(o => o.LastName == lastName);
}

// Build OrderBy clause

query = query.OrderByDescending(o => o.orderNo);

// Execute Query

results = query.ToList();