c# - 如何重构 linq 查询以重用其部分

标签 c# linq refactoring reusability

我尝试重构这个查询有一段时间了,但没有成功:

db.Kiosks.Where(kiosk => db.KioskDesignations.Where(
                 q =>
                 q.Kiosk.KioskId == kiosk.KioskId &&
                 (!q.RedesignedAt.HasValue||q.RedesignedAt.Value<= DateTime.Now))
                     .OrderByDescending(q => q.RedesignedAt)
                     .Take(1).Select(q => q.Type.DefinitionId).Contains(id)
                                   );

问题在于。每个信息亭都有一个历史名称集合,在应用程序的某些部分,我们希望根据其最新状态执行某些操作(通过检查其类型或事件或其他一些数据),因此这部分查询将重复:

db.KioskDesignations.Where(q =>
          q.Kiosk.KioskId == kiosk.KioskId &&
          (!q.RedesignedAt.HasValue || q.RedesignedAt.Value <= DateTime.Now))
               .OrderByDescending(q => q.RedesignedAt).Take(1)

到目前为止,我已经尝试将这部分编写为函数、Func 和表达式,但它们都不起作用。您能告诉我应该如何重构这个查询,以便我可以重用重复部分吗? 非常感谢。

最佳答案

例如,您可以链接Wheres:

    private void Something()
    {
            var query = GetStandardWhere(db.Kiosks);
            query = query.Where( //some new criteria);
            return query
                 .OrderByDescending(q => q.RedesignedAt)
                 .Take(1).Select(q => q.Type.DefinitionId).Contains(id)
                               );
    }

    private IQueryable<KioskDesignation> GetStandardWhere(IQueryable<KioskDesignation> query)
    {
        return
            query.Where(
                kiosk =>
                db.KioskDesignations.Where(
                    q =>
                    q.Kiosk.KioskId == kiosk.KioskId &&
                    (!q.RedesignedAt.HasValue || q.RedesignedAt.Value <= DateTime.Now));
    }

关于c# - 如何重构 linq 查询以重用其部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16945187/

相关文章:

javascript - 在 MVC 5 中实现一个登录 LinkedIn 的窗口

c# - CSharpCodeProvider 编译性能

c# - 如何以更好的方式写这个?

c# - 表中连续插入数据

c# - 基于 LINQ 中任意键的不同对象列表

javascript - 在您的应用程序中拥有唯一的方法名称是否有益?

php - 我怎样才能简化这个冗余代码?

java - 如何重写方法将实例变量和局部变量相加,从而生成数据类型 Double 的新变量?

c# - 如何检索 ADO.NET SqlCommand 的结果?

linq - 使用 LINQ 呈现层次结构?