【问题标题】:Linq to SQL - Ignore search parameters that are null or zeroLinq to SQL - 忽略空或零的搜索参数
【发布时间】:2016-04-06 13:25:42
【问题描述】:

我有一个搜索表单,用户可以在其中输入一对多参数(数据、状态、类型、ID、摘要、描述),其余的留空。

这是我用于基本搜索的 Linq to SQL 代码。有没有办法检查 Linq 中的每个参数是否为零、null 或空字符串?

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>();
var query = from r in SimCareDB.Requests
            where r.CustomerID == 31       
            select (new RequestStatusModel
            {
                RequestID = r.RequestID,
                RequestTitle = r.RequestTitle,
                DateAdded = r.DateAdded.ToString(),
                DateChanged = r.DateChanged.ToString(),
                RequestStatusID = r.StatusID
            });

谢谢!

【问题讨论】:

  • 为什么它必须在你的 LINQ 查询中?
  • 所有很棒的答案,这解决了我的问题。谢谢!

标签: c# asp.net-mvc linq


【解决方案1】:

如果它不必在您的 linq 语句中,您可以使用经典的 if 语句来完成。

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>();
var query = from r in SimCareDB.Requests
            where r.CustomerID == 31
            select (new RequestStatusModel
            {
               //...
            });

if(data != null) //Replace with additional checks, if neccessary
{
   query = query.where(x=> ...);
}

if(status != null) 
{
   query = query.where(x => ...)
}

【讨论】:

    【解决方案2】:

    如果您只想在通过某些条件时进行过滤,您应该这样做

    var objRequestStatus = new List<RequestStatusModel>();
        var query = from r in SimCareDB.Requests
                    where r.CustomerID == 31
    
    if (String.IsNullOrEmpty(r.RequestID))
        objRequestStatus = objRequestStatus.Where(x => x.RequestID == r.RequestID);
    
    if (String.IsNullOrEmpty(r.RequestTitle))
        objRequestStatus = objRequestStatus.Where(x => x.RequestTitle == r.RequestTitle);
    
    //you other filters here
    

    这会根据传递的请求将表达式设置为您想要的内容

    【讨论】:

      【解决方案3】:

      如果你想避开所有ifs,你可以这样做

      List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>();
      var query = from r in SimCareDB.Requests
                  where (r.CustomerID == 31) &&
                        (!String.IsNullOrEmpty(id) ? r.RequestID == id : true) &&
                        (!String.IsNullOrEmpty(status) ? r.StatusID == status : true)
                        /* And so on */
                  select (new RequestStatusModel
                  {
                      RequestID = r.RequestID,
                      RequestTitle = r.RequestTitle,
                      DateAdded = r.DateAdded.ToString(),
                      DateChanged = r.DateChanged.ToString(),
                      RequestStatusID = r.StatusID
                  });
      

      【讨论】:

      • 所有这些检查将被翻译到数据库并在那里执行。这可能会导致不幸的问题,例如错误的查询计划选择或无法使用有利的索引。
      猜你喜欢
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多