过滤数据,检查变量是否为空,然后检查db中是否存在变量

时间:2017-02-20 11:50:46

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

我有一个带有旅行的页面'我从中获取了我的searchTrip对象,其中包含用户输入的所有字段。用户可能只输入其中一些例如或仅,因此,我需要检查值是否为空,如果没有,那么我可以在我的linq中使用它查询。

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

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

3 个答案:

答案 0 :(得分: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条件。

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

答案 1 :(得分:0)

我认为最好的做法是拆分调用并使用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));
} 

这不会失去效率,因为行程是一个IQueryable,并且在调用时会执行声明。

答案 2 :(得分:0)

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

//usage:
//string notNullValue = table.NullableColumn ?? "";

... u.From.Contains(indexControllerViewData.SearchTrip.From ?? "")...

更多信息: MSDN Coalesce Operator : '??'