C# SQL选择where,但仅检查参数是否为true
我想使用select语句从我的sql数据库中选择一些变量,以对照一些参数检查每个元素,如: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)
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()
ondb.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()
ondb.Spaces
直接将整个表放入应用程序内存,并在LINQ to Objects查询时进行所有筛选。这绝对不是您希望发生的事情…这可能是最好的方法,是的。除非您想使用反射来迭代表中的所有列,并检查它们的类型是否正确一个繁重且耗时的操作。为什么不编写一个存储过程,并在EF上下文中使用它呢?仅供参考,您不应该只使用(var sampleDB=db)来执行此
它将进行dispose,任何其他使用它的方法都将失败。这可能是最好的方法,是的。除非您想使用反射来迭代表中的所有列并检查它们的类型,这是一个繁重且耗时的操作。为什么不编写一个存储过程,并在EF上下文中使用它呢?仅供参考,您不应该使用(var-sampleDB=db)执行此操作
它将进行处理,而使用它的任何其他方法都将失败。