避免使用多个where子句

时间:2015-08-11 10:21:40

标签: c# sql linq linq-to-sql entity-framework-4

如何在单个lambda表达式中定义多个where子句。我需要的是,如果lambda表达式找到带有匹配条件的结果,那么它只过滤掉那些记录,否则它将返回所有记录。我想在一个lambda表达式中得到它。因为我有多个标准,我必须使用lambda表达式从数据库中过滤记录。

我不想使用if else条件然后相应地更改我的lambda表达式。我想用一个表达式来实现这个目标。

var objList = from o in db.sometable
                              join p in db.sometable1 on o.sometable1Id equals p.Id
                              join q in db.sometable2 on p.Id equals q.Id
                              join r in db.sometable3 on p.Id equals r.Id
                              join s in db.sometable4 on o.id equals s.Id
                              where r.1stcriteria == X || r.2ndCriteria == Y || r.3rdCriteria == Z
                              select new
                              {
                                  o.Id,
                                  r.X,
                                  r.Y,
                                  s.Name,
                                  o.area_sold,
                                  p.stock

                              };

在上面的表达式中,我需要得到结果,即使没有标准匹配或者其中任何一个匹配。或者甚至其中两个匹配。

2 个答案:

答案 0 :(得分:1)

我不完全明白,你可以在其中使用多重标准:list.where(x =>(condition1)||(condition2))。要获得整个列表,只需添加一个,如果之后:

var filteredList = myList.where(x=> (conditions1(x)) || (condition2(x))).toList();

if (filteredList.count == 0)
    filteredList = myList;

答案 1 :(得分:1)

在你的lambda表达式中,操作符逻辑仍在运行中,如果我理解了你想要的东西,它会为你提供你需要的东西,比如说我们接受这个

.Where(a=> a.ID == someId);

说这将是我们的一个标准,现在为了添加一秒,您可以使用&&添加AND或OR逻辑到混音。和||

.Where(a=> (a.ID == someId) && ((a.ID < 50) && (a.ID > 5));

如果您想正确地对布尔检查进行分组,则括号很重要。