如果我不确定要匹配哪些属性,如何将 Where 表达式添加到 LINQ 查询中

本文关键字:表达式 Where 添加 查询 LINQ 不确定 属性 如果 | 更新日期: 2023-09-27 18:31:47

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

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
}

如果我不确定要匹配哪些属性,如何将 Where 表达式添加到 LINQ 查询中

下面假设 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);

假设您的存储库返回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);
}
//...

如果您必须 AND 这些条件并假设您的存储库返回 IQueryable(如果不更改它或添加另一个重载或其他内容)

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 result = Repository.Orders.Where(x => 
    (firstName == null || firstName.Trim() == "" || x.FirstName.Contains(firstName)) 
    && (lastName == null || lastName.Trim() == "") || x.LastName.Contains(lastName)) 
    && (orderNo == 0 || x.OrderNo == orderNo)).OrderByDescending(x => x.OrderNo)

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