【问题标题】:Filtering data, check if variable is empty before checking if variable exists in db过滤数据,在检查变量是否存在于数据库之前检查变量是否为空
【发布时间】:2017-02-20 11:50:45
【问题描述】:

我有一个带有“trips”的页面,我可以从中获取我的 searchTrip 对象,其中包含用户输入的所有字段。用户可能只输入了其中一些,例如FromTo 或仅 From,因此,我需要检查该值是否为空,如果不是,则可以在我的 linq 中使用它查询。

基本上,如果trip From 值未设置或为空,则不检查trips 是否包含它。与所有其他参数相同。

var trips = db.Trips
              .Where(u =>
                u.From.Contains(indexControllerViewData.SearchTrip.From) &&
                u.To.Contains(indexControllerViewData.SearchTrip.To) &&
                u.DepartureDate.Equals(indexControllerViewData.SearchTrip.DepartureDate) &&
                u.ReturnDate.Equals(indexControllerViewData.SearchTrip.ReturnDate));

【问题讨论】:

    标签: c# asp.net entity-framework linq


    【解决方案1】:

    由于数据是作为视图数据的属性返回的,LINQ 语句可以构建成一系列这样的

    var searchTrip = indexControllerViewData.SearchTrip;
    var trips = db.Trips;
    
    if (!string.IsNullOrEmpty(searchTrip.From))
    {
        trips.Where(u => u.From.Contains(searchTrip.From))
    }
    if (!string.IsNullOrEmpty(searchTrip.To))
    {
        trips.Where(u => u.To.Contains(searchTrip.To))
    }
    // ... and so on
    

    该方法的基本原理是可以构建 LINQ 语句,并且不必立即指定 Where 条件。

    请记住,这不是一个很好的设计,因为搜索条件的任何更改(可能是添加目的地城市)都需要更改代码。一个更强大的解决方案是将搜索旅行标准作为标准对象数组返回并循环它们 - 但这需要预先进行更多更改(可能是广泛的),并且超出了您的问题范围。但是,如果您想探索它,请随时询问其他人。

    【讨论】:

    • 是的,我想这就是我现在要坚持的。我在考虑数组,但我也在使用许多不同的类型 DataType、int、floats 所以它不会那么直截了当。
    • 很高兴您有答案。不同类型的存在是标准对象数组更直接的原因——每个标准对象都知道如何处理其案例的细节。初始设置需要更多时间,但之后会更容易。
    【解决方案2】:

    我认为最好的方法是拆分调用并使用 if 语句检查表单值。如果有值,则修改查询以过滤该值。

    例如

    var trips = db.Trips.Where(u => u.Active) //or what ever initial query you want to do, preferably on a value that is required.
    
    if(indexControllerViewData.SearchTrip.From.hasValue) //check that there is a value (I dont know what type the From value is)
    {
      trips = trips.where(u => u.From.contains(indexControllerViewData.SearchTrip.From));
    } 
    

    这不会降低效率,因为 trips 是一个 IQueryable 并且 on 的语句在调用时会被执行。

    【讨论】:

      【解决方案3】:

      您可以使用 Coalesce 运算符:??

      //usage:
      //string notNullValue = table.NullableColumn ?? "";
      
      ... u.From.Contains(indexControllerViewData.SearchTrip.From ?? "")...
      

      更多信息在这里: MSDN Coalesce Operator : '??'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 2012-02-05
        相关资源
        最近更新 更多