gpt4 book ai didi

c# - 不确定如何使用 LINQ 实现对 nHibernate 的特定扩展

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:26 28 4
gpt4 key购买 nike

在颇受欢迎的 ayende.com 网站的博文中 blog post .有一个部分以非常具体的方式吸引了我的眼球。

接近帖子的结尾,他发表了评论,引用自网站

The answer that I give for things like "well, so how can I apply security filtering” is that you throw that into an extension method and do something like this:

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>() ...

这告诉我正在使用的对象是一个 NHibernate.Linq.Query<T>目的。我主要用QueryOver<T>在我的项目中,目的是将它们转换到 Futures ,但我离题了……

我意识到这是非常模棱两可的,而且根本不是一个非常明智的请求 - 但我想知道是否有人愿意发布一个示例,说明如何实现此示例代码。

这是我不明白的地方;

  1. 我不明白如何扩展 Query<T>QueryOver<T>对象。
  2. 如果我确实扩展了对象,我不明白如何使该扩展影响/过滤数据库查找。
  3. 如果我能够影响数据库查找,我不明白它将如何影响性能。
  4. 我不太明白CurrentUser在哪里来自。在我看来,它需要另一次数据库访问才能获得它,这又一次违背了 nhprof 和我一直在阅读的大部分书籍不断告诉我的(不要多次访问一次手术)。

第 3 点是最让我困惑的一点。我唯一能想到的是这个方法接受查询并运行它,然后过滤它,然后返回结果。这对我来说似乎违反直觉(而且它似乎与我在 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 查询引擎将附加条件构建到 sql 中。

3) 性能显然与您编写的查询有关,更复杂的查询将执行得更慢。但是,扩展方法本身并没有对性能造成影响。重要的是要了解查询在构建整个查询之前不会执行。这通常由 .ToList()、Single()、First() 或其他实际枚举可查询的语句触发。

4) CurrentUser 来自您,可能需要事先从数据库中获取。但是您可能无论如何都必须在您的应用程序中这样做。

关于c# - 不确定如何使用 LINQ 实现对 nHibernate 的特定扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com