C# SQL选择where,但仅检查参数是否为true

C# SQL选择where,但仅检查参数是否为true,c#,asp.net-mvc,linq,if-statement,C#,Asp.net Mvc,Linq,If Statement,我想使用select语句从我的sql数据库中选择一些变量,以对照一些参数检查每个元素,如: public ActionResult Filter_Rooms(bool pFilter, int pCapacity, bool pBeamer, bool pNote, bool pTelevision, bool pTel, bool pWifi) { using (var sampleDB = db) { if (pFilter)

我想使用select语句从我的sql数据库中选择一些变量,以对照一些参数检查每个元素,如:

  public ActionResult Filter_Rooms(bool pFilter, int pCapacity, bool pBeamer, bool pNote, bool pTelevision, bool pTel, bool pWifi)
    {
     using (var sampleDB = db)
        {
         if (pFilter)
            {
                var maxCap = pCapacity + 20;
                IQueryable<RoomViewModel> rooms = sampleDB.Spaces
                          .ToList()
                          .Where(r => (r.roomCapacity >= pCapacity 
                             && r.roomCapacity <= maxCap) 
                             && r.roomBeamer == pBeamer 
                             && r.roomCapacity == pCapacity 
                             && r.roomTelevision == pTelevision)
                          .ToList()
                          .Select(room => new RoomViewModel()
public action结果过滤室(bool-pFilter、int-pCapacity、bool-pBeamer、bool-pNote、bool-pTelevision、bool-pTel、bool-pWifi)
{
使用(var sampleDB=db)
{
if(pFilter)
{
var maxCap=pCapacity+20;
IQueryable房间=示例数据库空间
托利斯先生()
其中(r=>(r.roomCapacity>=P容量
&&r.roomCapacity新RoomViewModel()
其中,除PCCapacity外,其他参数均为布尔值

使用这些参数,我正在检查我的db(=房间)的哪个记录具有给定的参数(=设备)。但这里只有布尔值为true的参数才重要。布尔值为false的参数实际上是透明的,因为这些房间不必具有此参数,但它们是否具有此参数并不重要

现在,我正在检查那些有真实参数但没有虚假参数的房间,但是虚假参数应该被忽略

例如:pBeamer=true,pNote=true,pTelevision=true,pTelephone=true,但pWifi=false,所以一个有波束器、便笺、电视、电话且没有wifi的房间可以,但一个有波束器、便笺、电视、电话和wifi的房间也可以


现在我不敢相信为了组成select语句我必须检查每一个布尔值,那么有什么解决方案可以快速简便地完成这项工作吗?

您应该使用LINQ是懒惰的,并且在枚举结果之前不会执行查询。对于像您这样的问题,有一种模式:

var maxCap = pCapacity + 20;
var query = sampleDB.Spaces
          .Where(r => r.roomCapacity >= pCapacity && r.roomCapacity <= maxCap);

if(pBeamer)
    query = query.Where(r => r.roomBeamer);
if(pCapacity)
    query = query.Where(r => r.roomCapacity);
// ...

var rooms = query.Select(r => new RoomViewModel() //...);
var maxCap=pCapacity+20;
var query=sampleDB.Spaces
其中(r=>r.roomCapacity>=P容量和r.roomCapacity r.roomBeamer);
if(容量)
query=query.Where(r=>r.roomCapacity);
// ...
var rooms=query.Select(r=>newroomviewmodel()/…);

PS.调用
ToList()
on
db.Spaces
直接将整个表放入应用程序内存,并在LINQ to Objects查询时进行所有筛选。这绝对不是您希望发生的事情…

您应该使用LINQ是惰性的事实,并且在枚举结果之前不会执行查询。这是一种解决问题的模式,例如你的:

var maxCap = pCapacity + 20;
var query = sampleDB.Spaces
          .Where(r => r.roomCapacity >= pCapacity && r.roomCapacity <= maxCap);

if(pBeamer)
    query = query.Where(r => r.roomBeamer);
if(pCapacity)
    query = query.Where(r => r.roomCapacity);
// ...

var rooms = query.Select(r => new RoomViewModel() //...);
var maxCap=pCapacity+20;
var query=sampleDB.Spaces
其中(r=>r.roomCapacity>=P容量和r.roomCapacity r.roomBeamer);
if(容量)
query=query.Where(r=>r.roomCapacity);
// ...
var rooms=query.Select(r=>newroomviewmodel()/…);

PS.调用
ToList()
on
db.Spaces
直接将整个表放入应用程序内存,并在LINQ to Objects查询时进行所有筛选。这绝对不是您希望发生的事情…

这可能是最好的方法,是的。除非您想使用反射来迭代表中的所有列,并检查它们的类型是否正确一个繁重且耗时的操作。为什么不编写一个存储过程,并在EF上下文中使用它呢?仅供参考,您不应该只使用(var sampleDB=db)来执行此
它将进行dispose,任何其他使用它的方法都将失败。这可能是最好的方法,是的。除非您想使用反射来迭代表中的所有列并检查它们的类型,这是一个繁重且耗时的操作。为什么不编写一个存储过程,并在EF上下文中使用它呢?仅供参考,您不应该使用(var-sampleDB=db)执行此操作
它将进行处理,而使用它的任何其他方法都将失败。