【问题标题】:Sorting in EF with Repository and a Service Layer使用存储库和服务层在 EF 中排序
【发布时间】:2012-06-18 18:44:08
【问题描述】:

我有几个实现公共存储库接口的类,这些类中的一个方法是返回分页结果并接受一个

Expression<Func<T, bool>> OrderBy

我还创建了一个将使用存储库类的服务层,因为我已经阅读过将表达式对象从 UI 发送到服务层不是首选,所以我决定将其作为参数发送,如果我将其发送为包含参数名称的字符串我如何将字符串转换为要在表达式对象中使用的属性,例如假设我有一个名为 User 的实体并且我向方法发送一个名为“UserName”的参数,如何我可以将“UserName”转换为可以在 Expression> OrderBy 对象中使用的“UserName”属性吗?

如果可能的话,你能告诉我一个更合适的排序方式吗?

【问题讨论】:

  • 我看不出有什么理由不使用这个表达式。
  • 您提供的接口更多地用于 Where 子句,而不是用于排序。排序表达式应该是这样的: Expression> keySelector, bool asc ...
  • 我已经记住了 bool asc,orderby 参数 (KeySelection) 是用于排序的参数,我目前正在尝试使用表达式类从字符串 1 构建 orderby 参数。
  • Dynamic Linq 库已经做到了“从字符串构建 orderby”。来源也可用。

标签: c# entity-framework repository service-layer


【解决方案1】:

您的服务可以接收Func&lt;IQueryable&lt;T&gt;, IQueryable&lt;T&gt;&gt;,而不是接收Expression&lt;Func&lt;T, bool&gt;&gt;,这更灵活(启用任何LINQ,而不仅仅是在哪里)并且不需要表达式所做的额外工作。

如果您想防止误用(例如代码注入),则改为将枚举(或字符串)(包含 sortby 参数)传递给服务,并让您的服务相应地构建查询。

我希望您所说的 UI 不是指实际的 UI,而是指 VM 或控制器,并且您的视图不知道它们下面的任何内容。

【讨论】:

  • 我将更改我的服务层代码以通过表达式类接受订单的字符串或枚举我将按谓词构建订单,至于 UI 是指控制器作为我暂时我将使用 ASP.Net MVC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2011-04-02
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多