如何解决不确定如何使用LINQ实现对nHibernate的特定扩展
|| 在相当受欢迎的ayende.com网站博客文章中的博客文章中。有一个部分以非常具体的方式引起了我的注意。 在帖子的结尾处,他发表了评论,引用了该网站 我对诸如“好吧,那么我如何应用安全过滤”之类的问题给出的答案是,将其放入扩展方法中并执行以下操作:var query =
(
from post in session.Query<Post>()
where post.DueDate > DateTime.Now
select post
)
.FilterAccordingToUserPermissions(CurrentUser)
.ToList();
老实说,我真的很喜欢这种方法。对我来说看起来很干净。但是由于我对扩展方法或nHibernate的缺乏经验和知识,我似乎无法复制它。
var query = ( from post in session.Query<Post>() ...
这告诉我所使用的对象是一个“ 2”对象。我主要在项目中使用QueryOver<T>
以便将其投影为Futures
,但我离题了...
我意识到这是非常模棱两可的,根本不是一个非常简单的请求-但我想知道是否有人愿意发布一个示例,说明如何实现此示例代码。
这是我不明白的;
我不明白如何扩展ѭ5或QueryOver<T>
对象。
如果我确实扩展了对象,那么我将不理解如何使该扩展影响/过滤数据库查找。
如果我能够影响数据库查找,那么我将不了解它如何影响性能。
我不太了解the7的来源。在我看来,这将需要另一次数据库访问才能实现,但这又与nhprof和我一直阅读的大多数书籍不断告诉我的事情(不要为一个操作进行多次访问)。
第三点最让我感到困惑。我唯一能想到的是,此方法接受查询并运行它,然后对其进行过滤,然后返回结果。这对我来说似乎是违反直觉的(而且似乎与ayende.com/blog网站上我看到的很多东西背道而驰,因为它继承了很多不必要的数据库调用)
所以你有它。我很无能为力,而且我确实了解到,对于一些经验丰富的人来说,这是一个非常愚蠢的问题。但是我太陌生了,无法理解所有内容,因此我花了5个星期的大部分时间来尝试执行此操作。
解决方法
是的,您是对的,这个问题有点含糊,但我会尽力解决您的问题。
1)您实际上并没有扩展Query对象。您将要编写的扩展实际上是针对IQueryable的,因此...
public static IQueryable<Post> MySecurityExtension(this IQueryable<Post> repository,string currentUser)
{
return repository.Where(p => p.User == currentUser);
}
显然,您的安全性标准要比这复杂得多。
2)扩展方法允许您将其他条件添加到传入的IQueryable中。然后,当执行该查询时,NH Query引擎会将这些其他条件内置到sql中。
3)性能显然与您编写的查询息息相关,更复杂的查询将降低性能。但是,扩展方法本身并不会影响性能。重要的是要理解,直到整个查询都已构建,查询才会执行。这通常由.ToList(),Single(),First()或其他实际枚举可查询内容的语句触发。
4)CurrentUser来自您,可能必须事先从数据库中获取它。但是您可能仍然必须在应用程序中执行此操作。
,扩展方法与NHibernate无关。它仅用于过滤(或“将安全策略应用于”)NHibernate查询返回的“ 9”。
换句话说,NHibernate将返回一个可枚举的实体列表(来自数据库),而扩展方法将过滤该列表。没有提供ѭ10的实现,因此我们不能过多地谈论它,包括它是否会表现不佳。
扩展方法将在静态类中定义,如下所示:
public IEnumerable<Post> FilterAccordingToUserPermissions(this IEnumerable<post> list,CurrentUser user)
{
// implementation
}
而且不要忘记,没有像愚蠢的问题那样的问题:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。