我有NHibernate(使用NHibernate.Linq和Fluent NHibernate)设置查询缓存.一切正常,直到我做session.Save(new Widget())(即SQL INSERT).在此之后,该类型的所有查询都会Widget错过查询缓存.其他实体类型的查询缓存得很好.
using (ISession session = MySessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
// this INSERT screws things up
var widget = new Widget {Name = "Foo"};
session.Save(widget);
var query = (from w in session.Query<Widget>().Cacheable()
where w.Name == "Bar"
select w);
var fetched1 = query.FirstOrDefault();
var fetched2 = query.FirstOrDefault(); // miss?!
transaction.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我开始新的Transaction,问题仍然存在.如果我开始新的Session,问题就会消失.这似乎有点奇怪,因为我的理解是二级缓存被重置SessionFactory(不是Session).
我不认为这很重要,但我正在使用HashtableCacheProvider,因为我现在正在测试.
使用NHibernate 3.3.1.400,我在使用NHibernate的Linq提供程序表达什么是简单的SQL语句时遇到了问题.
我的域模型如下所示:
public class Site
{
public virtual Guid Id {get; set;}
public virtual string Name {get; set;}
}
// a site has many filers
public class Filer
{
public virtual Guid Id {get set;}
public virtual Site Site {get; set;}
public virtual string Name {get; set;}
}
// a filer has many filings
public class Filing
{
public virtual Guid Id {get set;}
public virtual Filer Filer {get; set;}
public virtual DateTime FilingDate {get; set;}
}
//a filing …Run Code Online (Sandbox Code Playgroud) 所以nHibernate 2.1 Alpha几天前问世了,但是sourceforge上的公告并未提及其他功能.特别是,它没有提到是否包括LINQ.我知道我已经读过LINQ将成为2.1的一部分,但那是6个月前.有人知道LINQ是2.1还是新功能?在官方网站上没有关于2.1 alpha功能的文档.
我使用包装器从表User获取一些数据
IQueryable<StarGuestWrapper> WhereQuery =
session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select(
u =>
new StarGuestWrapper()
{
FullName = u.Name + " " + u.LastName,
LoginTime = u.SomeDateTime,
MonthsAsMember = u.SomeIntergerValue,
StarRating = u.SomeOtherInteregValue,
UserPicture = u.Photo.PhotoData,
InstructorFullName = u.SomeInstructorName,
TalkInteractionDuringSession = u.SomeBoolValue,
GoalInteractionDuringSession = u.SomeOtherBoolValue
});
Run Code Online (Sandbox Code Playgroud)
我使用它作为IQueryable没有问题所以我可以在实际运行查询之前做有用的事情.喜欢 :
WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList();
Run Code Online (Sandbox Code Playgroud)
等等.
使用查询中的"where"语句会出现问题.例如:
WhereQuery.Where(s => s.StarRating == 1)
Run Code Online (Sandbox Code Playgroud)
将在运行时抛出异常,在User表中不存在'StarRating' - 当然它不是一个包装器属性.如果我实现查询,它将起作用
WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)
Run Code Online (Sandbox Code Playgroud)
但是它失去了使用IQueryable的所有感觉,我不想这样做.
奇怪而有趣的是,并非所有属性都来自包装器抛出错误,所有bool值都可以在where语句中使用.示例:
WhereQuery.Where(s => s.TalkInteractionDuringSession)
Run Code Online (Sandbox Code Playgroud)
它在EntityFramework中工作,为什么我在NHibernate中得到这个错误以及如何让它以我想要的方式运行?
我正在测试nhibernate 3 CR,但无法使用Linq创建以下SQL:
select *
from Users as {user}
inner join Test as test on test.UserId = user.Id
inner join Release as release on release.TestId = test.TestId
where Release.Status = 1
order by count(release.Status) desc;
Run Code Online (Sandbox Code Playgroud)
我还没有到目前为止,我目前的代码是这样的,给了我一些完全不同的东西:
var users = from user in Session.Query<User>()
join test in Session.Query<Test>() on user.Id equals test.User.Id
join release in Session.Query<Release>() on test.Id equals release.Test.Id
where release.Status == 1
orderby release.Status
descending
select user;
Run Code Online (Sandbox Code Playgroud)
有没有关于如何使用linq内连接的资源?我应该怎么做:
order by count(release.Status)
Run Code Online (Sandbox Code Playgroud)
这是应该用QueryOver完成的吗?
我有一个看起来像这样的nhibernate linq查询:
from b in session.Query<Bookmark>()
where b.Uri.Equals(uri) ||
b.Uri.Equals("www." + uri) ||
string.Concat("www.", b.Uri).Equals(uri)
select b
Run Code Online (Sandbox Code Playgroud)
这个爆炸,说康卡特不支持,但当我改变它
from b in session.Query<Bookmark>()
where b.Uri.Equals(uri) ||
b.Uri.Equals("www." + uri) ||
("www." + b.Uri).Equals(uri)
select b
Run Code Online (Sandbox Code Playgroud)
它运行正常,但查询如下所示:
select cast(count(*) as SIGNED) as col_0_0_
from bookmarks bookmark0_
where bookmark0_.Uri = 'www.google.com'
or bookmark0_.Uri = 'www.www.google.com'
or 'www.'+bookmark0_.Uri = 'www.google.com';
Run Code Online (Sandbox Code Playgroud)
其中'www.'+ bookmark0_.Uri是"添加"而不是concat('www.',bookmark0_.Uri).有没有办法在Linq for NHibernate for MySQL中连接字符串?
我正在尝试构建一个将应用于IQueryable集合的表达式.
我可以构建一个这样的表达式:
[TestClass]
public class ExpressionTests
{
private IQueryable<MyEntity> entities;
private class MyEntity
{
public string MyProperty { get; set; }
}
[TestInitialize]
public void Setup()
{
entities = new[]
{
new MyEntity {MyProperty = "first"},
new MyEntity {MyProperty = "second"}
}.AsQueryable();
}
[TestMethod]
public void TestQueryingUsingSingleExpression()
{
Expression<Func<MyEntity, bool>> expression = e => e.MyProperty.Contains("irs");
Assert.AreEqual(1, entities.Where(expression).Count());
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想分开表达式的两个部分:
[TestMethod]
public void TestQueryingByCombiningTwoExpressions()
{
Expression<Func<MyEntity, string>> fieldExpression = e => e.MyProperty;
Expression<Func<string, bool>> operatorExpression = e => e.Contains("irs");
// …Run Code Online (Sandbox Code Playgroud) 我有一个关联实体,<many-to-one>并且该实体有两个<many-to-one>我想一次获取的实体.我可以通过此查询实现此目的:
var tshead = session.Query<MainEntity>()
.Fetch(r=>r.FirstAssoc).ThenFetch(p=>p.Other)
.Fetch(r=>r.FirstAssoc).ThenFetch(p=>p.Another)
.Take(10)
.ToList();
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我必须写两次,.Fetch(r=>r.FirstAssoc)
我确信我可以避免这种情况,但我无法弄清楚如何.任何的想法 ?
谢谢 !
运行此Linq查询时,我收到"NotSupportedException"."不支持指定的方法." 什么方法?即使将"Count()"注释掉,错误也是一样的.空内部异常.
堆栈跟踪:
在Hydra.WPF.ViewModels.AddressListViewModel._primaryMemberListWorker_DoWork(对象发件人,DoWorkEventArgs e)在M:\项目\水润\ WPF \的ViewModels\AddressList中\ AddressListViewModel.cs:在System.ComponentModel.BackgroundWorker.WorkerThreadStart线1377(Object参数)
SQL查询:
Select * From _Members
Inner Join AddressDetailsCCN a on a.MemberId=_Members.MemberID
Inner Join
(
Select Address+Address2 as CombinedAddress
From AddressDetailsCCN Where ListId=84
group by Address+Address2
Having COUNT(*)>1
) B on B.CombinedAddress=A.Address+A.Address2
Where CombinedAddress is not null AND CombinedAddress!='' AND a.ListId=84
Order by ClientID, CombinedAddress
Run Code Online (Sandbox Code Playgroud)
LINQ:
var grouped =
(from mem in session.Query<Member>()
join detail in session.Query<Detail>() on mem.Id equals detail.Member.Id
join d2 in (from d3 in session.Query<Detail>()
where d3.AddressList.Id == criteria.AddressList.Id
group …Run Code Online (Sandbox Code Playgroud) 使用时:
.OrderByDescending(review => review.Country.Id == reviewCountryID)
Run Code Online (Sandbox Code Playgroud)
SQL查询生成正确,不会引发错误.
使用时:
.OrderByDescending(review =>
review.User != null &&
review.User.Country != null &&
review.User.Country.Id == userCountryID
)
Run Code Online (Sandbox Code Playgroud)
抛出异常:
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException
A recognition error occurred.
at NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate()
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at …Run Code Online (Sandbox Code Playgroud)