c# - 这叫什么,它有什么作用? (通用存储库的一部分)

标签 c# .net generics

我正在阅读通用存储库。我不断地陷入一些我不理解的代码中。我不知道它们是否有特定的名称。

这是我见过的最复杂的例子:

IEnumerable<T> GetByQuery(
    Expression<Func<T, bool>> query = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null, 
    string includeProperties = "");

我知道它(不管它是什么)显然会返回一个 IEnumerable,但我不知道如何阅读那些乱七八糟的官方文章,更不用说如何使用它了。

编辑:与具体示例的分割相比,我更感兴趣的是了解属于 的示例。在找到解释语法的内容之前,我需要知道它们的名称。林克??

编辑 2:我问的问题比被回答的问题要简单得多。我只想知道“我可以使用哪些搜索词来研究上述代码?”

最佳答案

请注意,所有这些都是非常有根据的猜测,基于 IQueryable<T>工作。

将其分为三个部分:

Expression<Func<T, bool>> query = null

这是一个 where 子句,它与传递给 Where 的签名相同IQueryable<T> 上的扩展方法.

您将传递一个表达式,它在代码中的表示方式与 lambda 相同; C# 编译器知道参数正在寻找 Expression并将其编译成表达式树而不是委托(delegate)。

例如,假设 TPersonint属性(property)Age ,您可以过滤掉任何 PersonIQueryable<Person> 返回年满 30 岁且具有以下特征:

p => p.Age > 30

Func<IQueryable<T>, IOrderedQueryable<T>> orderBy

这只是一个委托(delegate),如果提供,将允许您设置订单。假设你想要 Person按年龄排序的实例,您将使用:

q => q.OrderBy(p => p.Age)

这是因为返回类型是IOrderedQueryable<T> ,这如何扩展方法如ThenByThenByDescending仅在您调用 OrderBy 后弹出和 OrderByDescending ;这些扩展方法仅在 IOrderedQueryable<T> 上定义(它只不过是一个标记界面)。


includeProperties

这表明它在幕后使用 Entity Framework 。当您调用 Include在 Entity Framework 中,它允许您获取相关实体(通过外键)并加载与查询中返回的实体相关的实体。

假设 Person类有一个属性 Father类型 Person .如果你想查询Person实例并具有 Father属性也返回,那么你会调用 Include("Father")表明 Entity Framework 不仅应该获取 Person 的实例, 但它应该解决 Father关系也是如此。


IEnumerable<T>返回类型

这是返回的,因此您无权访问 IQueryable<T>实例并强制您具体化结果集(当您遍历它时)。

执行此操作的实现应该返回物化列表 ( IReadOnlyCollection<T> ),或者不只是(假设)转换为 IQueryable<T> 的东西至 IEnumerable<T> .

这也表明方法的编写者对客户的信任;作为IQueryable<T>未返回,它表示它不信任客户端不会进行低效的数据库调用(这是一个有效的问题)。

关于c# - 这叫什么,它有什么作用? (通用存储库的一部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825574/

相关文章:

C# 泛型类的性能

javascript - 如何在 Typescript 中定义依赖于字符串参数的函数参数类型?

c# - 获取 DayOfWeek 值的本地化字符串

c# - 在 C# 中,osm 文件(osm.pbf)的处理和过滤花费的时间太长

c# - 向 CaSTLe Windsor 注册 AutoMapper 5.1.1

c# - ASP.NET:字典中的Button对象上的EventHandler问题

c# - 无法更改 .aspx 页面的区域性

swift - 在 Swift 中使用泛型实例化 Realm 对象

c# - 如何调用wcf服务方法?

c# - .NET C# 中的简单 OCR 问题