我有一个简单的测试,运行查询5000次.查询的linq版本占用HQL的3倍,缓存的Linq版本比HQL的缓存版本慢得多
HQL:
session.CreateQuery(String.Format("from Episode where SeriesId='{0}' and SeasonNumber='{1}' and EpisodeNumber='{2}'", seriesId, seasonNumber, episodeNumber))
.SetMaxResults(1)
.SetCacheable(true)
.UniqueResult<Episode>();
Run Code Online (Sandbox Code Playgroud)
LINQ:
session.Query<Episode>()
.Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)
.Cacheable()
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
结果如下
HQL: Cached: less than a second No-Cache: 5 seconds LINQ: Cached: 8 seconds No-Cache: 15 seconds
我只是想确保我遇到了预期的开销,而不是我做错了什么.
如果那个头顶在那里并且我可以做的不多,你能否建议一个中间地带,这将需要更少的字符串,但提供更好的性能?
注意:我在Fluent Nhibernate中的缓存设置
.Cache(c => c.UseQueryCache().UseSecondLevelCache().UseMinimalPuts().ProviderClass<HashtableCacheProvider>())
将此示例视为基本示例,我创建了应用程序,但是当我执行此应用程序时,我收到以下错误.
未配置ProxyFactoryFactory.使用一个可用的NHibernate.ByteCode提供程序初始化session-factory配置节的'proxyfactory.factory_class'属性.示例:NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu示例:NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle
以下是我正在使用的代码段.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NHibernate;
using NHibernate.Cfg;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
User newUser = new User();
newUser.Id = "joe_cool";
newUser.UserName = "Joseph Cool";
newUser.Password = "abc123";
newUser.EmailAddress = "joe@cool.com";
newUser.LastLogon = DateTime.Now;
// Tell NHibernate that this object should be …Run Code Online (Sandbox Code Playgroud) asp.net nhibernate nhibernate-mapping nhibernate.search proxyfactory
有点困惑,
怎么样Solr的或Solrnet从任何不同NHibernate的搜索?Solr是否向Lucene.net提供Nhibernate Search的更多内容?
我试图在一个HTML块中突出显示搜索词,问题是如果用户搜索"颜色",这个:
<span style ='color:white'>白色</ span>
成为:<span style =' <b>颜色</ b>:白色'> <b>白色</ b> </ span>
显然,弄乱我的风格并不是一个好主意.
这是我正在使用的代码:
Query parsedQuery = parser.Parse(luceneQuery);
StandardAnalyzer Analyzer = new StandardAnalyzer();
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b class='search'>", "</b>");
QueryScorer scorer = new QueryScorer(parsedQuery);
Highlighter highlighter = new Highlighter(formatter, scorer);
highlighter.SetTextFragmenter(new SimpleFragmenter());
Highlighter.GetBestFragment(Analyzer, propertyName, invocation.ReturnValue.ToString())
Run Code Online (Sandbox Code Playgroud)
我猜这个问题是我需要一个不同的Fragmenter,但我不确定.任何帮助,将不胜感激.
这不是一个问题,我过去几天一直在研究这个问题,并且认为我想贡献一些东西,这些东西吸引了我一直在阅读的许多不同的想法,并提出了我的解决方案.问题...
问题是在Nhibernate中急切加载n级子对象并且nHibernate不知道树的深度.我已经看到通过使用直接sql和Union All解决了这个问题,但不幸的是我无法让它工作,通常是因为nhibernate不知道你渴望加载对象.所以我查看了以下代码,以便使用条件急切加载对象
var children = Session.CreateCriteria<MenuNode>()
.SetFetchMode("Children", FetchMode.Eager)
.Add(Expression.Eq("Id", 1))
.List<MenuNode>();
Run Code Online (Sandbox Code Playgroud)
这将为Id 1加载孩子,从这里你可以使用In语句一次加载多个实体.所以我只需要计算出属于这个层次结构的所有节点id,并使用In语句急切加载它.
因此,如果我为层次结构创建一个父表,并且每个节点都有一个层次结构ID,那么我可以使用此hql获取此层次结构的所有节点标识的列表
var sql = "select Distinct id from Nodes where (HierarchyId = :id) ";
var ids = Session.CreateSQLQuery(sql)
.SetInt32("id", id)
.List();
Run Code Online (Sandbox Code Playgroud)
并从这里急切地加载所有孩子为这棵树单独使用
var children = Session.CreateCriteria<MenuNode>()
.SetFetchMode("Children", FetchMode.Eager)
.Add(Expression.In("Id", ids))
.List<MenuNode>();
Run Code Online (Sandbox Code Playgroud)
唯一的问题是你没有急切地从层次结构父表中加载第一级节点,这可以正常完成.
var menu = Session.CreateCriteria<Menu>()
.SetFetchMode("RootNodes", FetchMode.Eager)
.Add(Expression.Eq("Id", id))
.List<Menu>();
Run Code Online (Sandbox Code Playgroud)
就这样,在三个SQL语句中,您已经将一个子对象急切地加载到n个级别.为了进一步优化,我使用多查询将两个主要查询链接在一起并同时发送两个语句.为了回退id而需要独立执行以撤回id的声明.
有关使用MultiCriteria进行预加载的更多详细信息,请点击此处.
希望这对某人有所帮助
我正在使用Fluent NHibernate,我想用Lucene实现NHibernate.Search但是我找不到任何关于如何用Fluent NHibernate做这个的例子.看来有两个步骤.(根据城堡)
在配置中设置Hibernate属性:
初始化事件侦听器以索引持久化对象
我想出了如何向Fluent NHibernate源配置添加属性,但我无法找到事件监听器的设置位置.
lucene nhibernate event-listener fluent-nhibernate nhibernate.search
我花了一整天的时间试图让NHibernate.Search和NHibernate 2.0一起工作,很遗憾地说我还没有管理它.我遇到了这里发布的问题并下载了该帖子链接的dll,但是这个例子使用的是搜索拦截器而不是EventListeners,我相信这是更新的做事方式.似乎很少有可用的信息,我能找到的信息很难理解,并且与其他信息相矛盾.
在这一点上,我对整个事情感到非常沮丧,我正在认真考虑编写自己的Nhibernate和Lucene(或者可能是另一个索引库)的集成.目前似乎NHibernate.Search现在已经足够成熟,我可以考虑使用它,我会更舒服地维护我自己的更简化的库.
我想知道的是,是否有一种明确的方法可以将NHibernate.Search与NHibernate 2一起使用,以及在生产环境中使用它是否可行.
我有以下代码
string idName = builder.IdentifierName;
Disjunction disjunction = Restrictions.Disjunction();
IList ids = new ArrayList(entityInfos.Length);
foreach (var entityInfo in entityInfos)
{
ids.Add(entityInfo .Id);
}
disjunction.Add(Restrictions.In(idName, ids));
criteria.Add(disjunction);
criteria.List();
Run Code Online (Sandbox Code Playgroud)
(我还没写过,它是来自NHibernate.Search的简化代码)
值idName是正确的("Id").
在我的映射中,我没有将Id映射到实体属性,它只是DB:
<id column="Id" type="int">
<generator class="native" />
</id>
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它会抛出异常:
[QueryException: could not resolve property: Id of: MyType]
NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) +326
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection(ICriteria subcriteria, String propertyName) +416
NHibernate.Criterion.InExpression.AssertPropertyIsNotCollection(ICriteriaQuery criteriaQuery, ICriteria criteria) +41
NHibernate.Criterion.InExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +49
NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +448
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +354 …Run Code Online (Sandbox Code Playgroud) nhibernate ×6
lucene ×2
.net ×1
asp.net ×1
criteria ×1
hql ×1
lucene.net ×1
proxyfactory ×1
solr ×1
solrnet ×1