标签: linq-to-nhibernate

NHibernate - 查询在保存新实体后错过了查询缓存

我有NHibernate(使用NHibernate.LinqFluent 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,因为我现在正在测试.

c# nhibernate fluent-nhibernate linq-to-nhibernate

6
推荐指数
1
解决办法
2052
查看次数

使用NHibernate Linq查询制定内部联接的麻烦

使用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 linq-to-nhibernate

6
推荐指数
1
解决办法
3835
查看次数

Linq是否在2.1 Alpha版本中出现了NHibernate?

所以nHibernate 2.1 Alpha几天前问世了,但是sourceforge上的公告并未提及其他功能.特别是,它没有提到是否包括LINQ.我知道我已经读过LINQ将成为2.1的一部分,但那是6个月前.有人知道LINQ是2.1还是新功能?在官方网站上没有关于2.1 alpha功能的文档.

linq nhibernate linq-to-nhibernate

5
推荐指数
1
解决办法
1241
查看次数

Linq to NHibernate使用where语句包装问题

我使用包装器从表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中得到这个错误以及如何让它以我想要的方式运行?

c# nhibernate linq-to-entities linq-to-nhibernate

5
推荐指数
1
解决办法
268
查看次数

Nhibernate 3 Linq - 内部连接

我正在测试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完成的吗?

linq nhibernate linq-to-nhibernate

5
推荐指数
2
解决办法
1万
查看次数

NHibernate/MySQL字符串连接

我有一个看起来像这样的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中连接字符串?

c# mysql nhibernate linq-to-nhibernate

5
推荐指数
1
解决办法
2147
查看次数

如何组合两个表达式?

我正在尝试构建一个将应用于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)

c# linq linq-to-nhibernate

5
推荐指数
1
解决办法
1638
查看次数

ThenFetch中的多次提取

我有一个关联实体,<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) 我确信我可以避免这种情况,但我无法弄清楚如何.任何的想法 ?

谢谢 !

nhibernate linq-to-nhibernate

5
推荐指数
1
解决办法
2519
查看次数

带有linq查询和groupBy的NotSupportedException

运行此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)

c# nhibernate linq-to-nhibernate

5
推荐指数
1
解决办法
617
查看次数

NHibernate OrderByDescending抛出异常`发生识别错误

使用时:

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

c# nhibernate linq-to-nhibernate

5
推荐指数
1
解决办法
5109
查看次数