Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 如何在多对多方案中使用Contains()?_C#_Nhibernate - Fatal编程技术网

C# 如何在多对多方案中使用Contains()?

C# 如何在多对多方案中使用Contains()?,c#,nhibernate,C#,Nhibernate,Nhibernate 3.0 嗨 经典博客场景: 博客 标签 职位 标签(多对多) 当我只想显示包含特定标记的帖子时,我使用Contains()函数如下: var tag = session.Query<Tag>().Single(x => x.Name == "C#"); var postsByTag = session.Query<Post>().Where(x => x.Tags.Contains(tag)); var tags = ses

Nhibernate 3.0

经典博客场景:

  • 博客
    • 标签
  • 职位
    • 标签(多对多)
当我只想显示包含特定标记的帖子时,我使用
Contains()
函数如下:

var tag = session.Query<Tag>().Single(x => x.Name == "C#");
var postsByTag = session.Query<Post>().Where(x => x.Tags.Contains(tag));
var tags = session.Query<Tag>().Where(x => x.Name.StartsWith("Nhibernate"));
var postsByTag = session.Query<Post>().Where(x => x.Tags.Any(t => tags.Contains(t)));
var tag=session.Query().Single(x=>x.Name==“C#”);
var postsByTag=session.Query(),其中(x=>x.Tags.Contains(tag));
这就像一个符咒,NHibernate生成正确的SQL

但是,现在我的用户希望获得所有包含至少一个标签的帖子。我最后是这样做的:

var tag = session.Query<Tag>().Single(x => x.Name == "C#");
var postsByTag = session.Query<Post>().Where(x => x.Tags.Contains(tag));
var tags = session.Query<Tag>().Where(x => x.Name.StartsWith("Nhibernate"));
var postsByTag = session.Query<Post>().Where(x => x.Tags.Any(t => tags.Contains(t)));
var tags=session.Query().Where(x=>x.Name.StartsWith(“Nhibernate”);
var postsByTag=session.Query(),其中(x=>x.Tags.Any(t=>Tags.Contains(t));
正如预期的那样,
postsByTag
只包含包含所选标记之一的帖子。不幸的是,我的问题是NHibernate不知道如何将其转换为SQL,因此它不使用
WHERE IN
而是从数据库获取所有帖子,然后再进行过滤。这对我来说是一个巨大的性能问题,因为博客可能有数百万篇文章

有人能解决这个问题吗

提前谢谢

HQL

您应该看看Hibernate查询语言,实际上有几种方法可以使用HQL甚至使用别名和ICriterion来实现


在与LINQ提供商合作后,我可以理解它的问题。谢天谢地,尽管有一种比包容和其他方法更好的方法

from post in session.Query<Post>
from tag in post.Tags 
where tag.Name.StartsWith("blah")
select post
来自post in会话。查询
从post.Tags中的标记
where tag.Name.StartsWith(“废话”)
选择职位

谢谢您的回答!我知道这一点,但我真的希望有一个LINQ解决方案。到目前为止,我已经完全避免使用HQL,我真的很想继续这样做:我不明白为什么在专门构建HQL时,您会坚持在HQL上执行LINQ查询,以便您可以优化对db的最终查询,以避免n+1选择。如果EF做了你不喜欢的事情,这是你不能用EF做的。你没有选择去优化它@贾斯汀·希尔德:我认为你把科技搞糊涂了。LINQ不等于EntityFramework。LINQ还支持执行显式连接的能力,以减少您正在谈论的选择。它非常强大。问题是NHibernates LINQ提供程序的实现可能不完整。@jhovgaard:那么您为什么要避免使用HQL呢?HQL是本机(N)Hibernate查询语言,它公开了比LINQ更好的API。如果你不喜欢学习新东西,可能你从事的职业不对。HQL和LINQ一样是强类型的。即使是其他开发人员不想学习,这仍然是一个不好的理由(更不用说将LINQ对象知识应用于NH LINQ时有很多微妙之处),无论这是不是正确的答案,如果我在下面的答案中的LINQ语句对您有效,我将非常高兴。LINQ给了开发者很多机会让他们上吊。这正是我想要的。这迫使NHibernate生成我所要查找的确切SQL(在中)。非常感谢!:-)