0

通过提升一个非常旧的系统并用 EF 替换 10 年的 nHibernate,我有一个奇怪的问题。我在为搜索页面制定一些 linq 扩展时遇到了麻烦。我要重构的是这个(此代码行多次使用或与其他类型的变体一起使用):

            if (searchCriteria.PlannedEndDateFrom.HasValue && searchCriteria.PlannedEndDateTo.HasValue)
            {
                efquerable= efquerable.Where(d => searchCriteria.PlannedEndDateFrom < d.PlannedEndDate && d.PlannedEndDate > searchCriteria.PlannedEndDateTo);

            }
            else if (searchCriteria.PlannedEndDateFrom.HasValue)
            {
                efquerable= efquerable.Where(d => d.PlannedEndDate > searchCriteria.PlannedEndDateFrom);
            }
            else if (searchCriteria.PlannedEndDateTo.HasValue)
            {
                efquerable= efquerable.Where(d => d.PlannedEndDate < searchCriteria.PlannedEndDateTo);

            }

这应该能够转移到我做这种检查的扩展......

       private static IQueryable<T> FilterOnCorrectSearchDateTime<T>(this IQueryable<T> efquerable, Expression<Func<T, DateTime>> datePropertyName, DateTime? dateFrom, DateTime? dateTo)
       {
//Missing code
}

然后被称为

EFquerable = EFquerable.FilterOnCorrectSearchDateTime<EntityObjectWithDatetimeproperty>(s=>s.PlannedEndDate ,searchCriteria.PlannedEndDateFrom,searchCriteria.PlannedEndDateTo);

关于如何解决这个问题的任何建议?我坚持的是处理对发送到函数的属性的检查。如何将 Expression<Func<T, DateTime>> datePropertyName 表述为 Where 函数的可用语句?在这次重构中我还有什么遗漏的吗?我一直在使用 System.Linq.Dynamics ,但这似乎不太好......

4

1 回答 1

1

您可以像这样实现 IQueryable 扩展方法:

    public static IQueryable<T> FilterOnCorrectSearchDateTime<T>(this IQueryable<T> efquerable, Func<T,DateTime> datePropertyValue, DateTime? dateFrom, DateTime? dateTo)
    {
        if (dateFrom.HasValue && dateTo.HasValue)
        {
            return efquerable.Where(d => dateFrom.Value < datePropertyValue(d)
                                    && datePropertyValue(d) < dateTo.Value);
        }
        else if (dateFrom.HasValue)
        {
            return efquerable.Where(d => datePropertyValue(d) > dateFrom);
        }
        else if (dateTo.HasValue)
        {
            return efquerable.Where(d => datePropertyValue(d) < dateTo);
        }

        return efquerable;
    }

然后使用它:

var results =  
iQueryable.FilterOnCorrectSearchDateTime( 
      (entityObject)=> entityObject.YourDateTimeField,
      dateFrom,
      dateTo);

更新:

有 r LINQKIT

可能对您有所帮助的软件包。但是,恕我直言,将整个事情实现为动态 SQL 语句,这就是您实际拥有的内容,这将是一个更好的整体解决方案。

于 2021-09-09T14:49:47.917 回答