Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为了解lambdas的DAL构建谓词或条件生成器?_C#_Design Patterns_Lambda_Data Access Layer - Fatal编程技术网

C# 如何为了解lambdas的DAL构建谓词或条件生成器?

C# 如何为了解lambdas的DAL构建谓词或条件生成器?,c#,design-patterns,lambda,data-access-layer,C#,Design Patterns,Lambda,Data Access Layer,我正在进行数据访问层设计,我们还没有最终确定我们将使用什么ORM。 我倾向于NHibernate+FluentMappings+NHibernate.Linq,但根据项目时间表,我们甚至可以等待EF4。我想替换如下方法: IList<Customer> FindById(int id); IList<Customer> FindByName(string fullName); IList FindById(int-id); IList FindByName(字符串全名

我正在进行数据访问层设计,我们还没有最终确定我们将使用什么ORM。 我倾向于NHibernate+FluentMappings+NHibernate.Linq,但根据项目时间表,我们甚至可以等待EF4。我想替换如下方法:

IList<Customer> FindById(int id);

IList<Customer> FindByName(string fullName);
IList FindById(int-id);
IList FindByName(字符串全名);

IList FindByCriteria(Func标准);
甚至

IList<T> FindByCriteria(Func<T, bool> criteria)
IList FindByCriteria(Func标准)
因此,我们的想法是基于需求(从UI或业务)将标准动态链接或构建到存储库或DAO对象。欢迎提供任何代码示例、链接、博客帖子和提示


提前谢谢

链接到下面一系列文章的第一篇。不是100%准确,但一般概念适用。本文中使用的ORM是LLBLGen Pro,但应适用于任何成熟的ORM框架:


链接到下面一系列文章的第一篇。不是100%准确,但一般概念适用。本文中使用的ORM是LLBLGen Pro,但应适用于任何成熟的ORM框架:


如果只想使用lambdas,则必须处理System.LINQ.Expression类。 它允许您访问lambda表示的代码


IQueryable周围的类型对您来说可能也很有趣。

如果您只想使用lambdas,则必须处理System.LINQ.Expression类。 它允许您访问lambda表示的代码


IQueryable周围的类型对您来说可能也很有趣。

如果您正在编写ORM,那么您应该问这个问题

如果您正在编写一个构建在ORM之上的应用程序,它应该已经能够表达通用查询(例如LINQ表达式)。应用程序的任务是将通用查询功能利用到特定于系统的查询中,如“按名称查找客户”

通用查询是直接位于特定于应用程序的查询之下的抽象级别。存储库本身不应包含通用功能

有关更多信息和代码示例,请参见我的回答:


如果您正在编写ORM,那么您应该问这个问题

如果您正在编写一个构建在ORM之上的应用程序,它应该已经能够表达通用查询(例如LINQ表达式)。应用程序的任务是将通用查询功能利用到特定于系统的查询中,如“按名称查找客户”

通用查询是直接位于特定于应用程序的查询之下的抽象级别。存储库本身不应包含通用功能

有关更多信息和代码示例,请参见我的回答:


谢谢你,菲尔!我会调查的。谢谢菲尔!我会调查的。刚刚找到这个链接[有人试着把这个应用到我提到的场景吗?刚刚找到这个链接[有人尝试将此应用于我提到的场景吗?我不确定我是否理解你的意思。我理解链接,我的问题更多的是如何为任何BO或实体动态构建表达式树或谓词。你的问题是如何用通用查询替换特定查询,即删除Find(id)和Find(name)并在应用程序级别替换为Find(标准)。我的答案是这是一种反模式。数据框架(ORM)启用通用查询;您的应用程序应启用特定查询。在应用程序级别启用通用查询不会给您带来任何好处;您希望封装如何按名称查找客户,而不是让客户知道。嗯..我看到的场景是客户需要名称以“Per”开头的客户和Age>24。业务层接收此请求。使用谓词生成器生成类似expression=c=>(c.Name.StartsWith(“Per”)&&(c.Age>24)的内容,并将此谓词/表达式传递给GetByCriteria(expression)…这在我在评论部分发布的链接中得到了更好的解释..谢谢你花时间回答我的问题..非常感谢itOk,我知道你所问的和我所说的有什么关系。你正在准确地描述LINQ是如何工作的。
System.LINQ.Expressions
命名空间包含可以描述代码的对象,这正是你所需要的。请参见我的回答:。我只是确保您没有将谓词生成责任放在业务层客户端上。我不确定我是否理解您的意思。我理解链接,我的问题更多的是关于如何为任何BO或实体动态构建表达式树或谓词。您的问题是关于如何替换说明符在应用程序级别,使用通用的c查询,即删除Find(id)和Find(name)并替换为Find(criteria)。我的答案是这是一种反模式。数据框架(ORM)启用通用查询;您的应用程序应启用特定查询。在应用程序级别启用通用查询不会给您带来任何好处;您希望封装如何按名称查找客户,而不是让客户知道。嗯..我看到的场景是客户需要名称以“Per”开头的客户和Age>24。业务层接收此请求。使用谓词生成器生成类似expression=c=>(c.Name.StartsWith(“Per”)&&(c.Age>24)的内容,并将此谓词/表达式传递给GetByCriteria(expression)…这在我在评论部分发布的链接中得到了更好的解释..谢谢你花时间回答我的问题..非常感谢itOk,我知道你所问的和我所说的有什么关系。你正在准确地描述LINQ是如何工作的。
System.LINQ.Expressions
命名空间包含可以描述代码的对象,这正是你所需要的。请参见我的回答:。我只是确保您没有将谓词构建责任放在业务层客户端上。
IList<T> FindByCriteria(Func<T, bool> criteria)