繁体   English   中英

具有Dynamic SQL WHERE子句的实体框架搜索功能

[英]Entity Framework Search functionality with Dynamic SQL WHERE clause

嗨,大家好,我使用Dynamic SQL进行搜索查询,我曾经将WHEREAND子句逐段附加并形成一条语句,为此我最近来到了下面,这真是太棒了

动态WHERE-Clause的酷替代品

Select * From tblEmployees 
where EmployeeName = Coalesce(@EmployeeName, EmployeeName) AND
Department = Coalesce(@Department, Department ) AND
Designation = Coalesce(@Designation, Designation) AND
JoiningDate >= Coalesce(@StartDate, JoiningDate) AND 
JoiningDate <= Coalesce(@EndDate, JoiningDate) AND
Salary >= Coalesce(@Salary, Salary)

现在的问题是,因为我实现了实体框架,所以我需要使用Linq查询实现相同的功能。 我有目前无法处理的可为空的字节类型和可为空的布尔值

就像Coalesce一样,我的愚蠢尝试是&& (s.Floors == deal.Floors.HasValue ? null : s.Floors)

下面的代码不符合任何结果

[HttpPost]
        public ActionResult Results(Deal deal, bool exactMatch)
    {
        List<Deal> deals;

        if (exactMatch)
        {
            deals = dataBase.Deals.Where(s =>
               (s.OwnerName.Contains(deal.OwnerName) || s.OwnerName == null)
            && (s.Rooms == deal.Rooms || s.Rooms == null)
            && (s.BathRooms == deal.BathRooms || s.BathRooms == null)
            && (s.Floors == deal.Floors || s.Floors == null)
            && (s.Builtin == deal.Builtin || s.Builtin == null)
            && (s.Kitchens == deal.Kitchens || s.Kitchens == null)
            && (s.DoubleUnit == deal.DoubleUnit || s.DoubleUnit == null)
            && (s.Corner == deal.Corner || s.Corner == null)
            && (s.Remarks.Contains(deal.Remarks) || s.Remarks == null)
            ).ToList();
        }
        else
        {
            deals = dataBase.Deals.Where(s =>
               (s.OwnerName.Contains(deal.OwnerName) || s.OwnerName == null)
            || (s.Rooms == deal.Rooms || s.Rooms == null)
            || (s.BathRooms == deal.BathRooms || s.BathRooms == null)
            || (s.Floors == deal.Floors || s.Floors == null)
            || (s.Builtin == deal.Builtin || s.Builtin == null)
            || (s.Kitchens == deal.Kitchens || s.Kitchens == null)
            || (s.DoubleUnit == deal.DoubleUnit || s.DoubleUnit == null)
            || (s.Corner == deal.Corner || s.Corner == null)
            || (s.Remarks.Contains(deal.Remarks) || s.Remarks == null)
            ).ToList();
        }

        return View(deals);
    } 

表的值如下

id Bathroom Floors
1   1        2
2   1        4
3   2        6
4   3        1

我需要具有ID 1和2的结果,例如在前端用户中,我只想将浴室字段填充为“ 1”,而将地板字段保留为空

您正在测试表中的字段是否等于'deal'属性或该字段为空,而不是这样做:

s.Remarks.Contains(deal.Remarks) || deal.Remarks == null

如果这样做,它应该是等效的查询。

您也可以累积执行此操作。 例如,在完全匹配的情况下,您可以执行以下操作:

deals = dataBase.Deals;
if (deal.OwnerName != null)
   deals = deals.Where(s => s.OwnerName.Contains(deal.OwnerName));

if (deal.Rooms != null)
  deals = deals.Where(s => s.Rooms == deal.Rooms)

这样可以使查询结果更加有效。 有一种类似的方法可以通过使用联合对不完全匹配进行此操作。 我不了解语法。

不太一样。 在查询中, coalesce是在参数上,然后将记录值作为默认值(如果为空)。 在您的C#lambda中,您正在检查参数是否与表值相同,然后检查表值是否为null但这忽略了参数中具有null值的可能性。

SQL

Department = Coalesce(@Department, Department )

将会

(s.Department == deal.Department || deal.Department == null)

这不是你现在拥有的

(s.Department == deal.Department || s.Department == null)

编辑

如果您想复制COALESCE表达式,现在可以用这种方式编写它,尽管我不确定它是否会降低效率/性能。

(s.Department == (deal.Department ?? s.Department))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM