考虑一个典型的NHibernate上下文类.
public class SampleContext : NHibernateContext
{
public SampleContext(ISession session)
: base(session)
{ }
public IQueryable<Person> People
{
get { return Session.Linq<Person>(); }
}
public Person GetPerson(int id)
{
get { return Session.Linq<Person>().SingleOrDefault(p => p.ID == id); }
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
- 我怎样才能重写GetPerson方法来忽略缓存并直接从数据库中检索数据?
任何人都可以回答我的不同之处
Session.Query
Session.Linq和
Session.QueryOver
我真正感兴趣的是:
未来版本将支持哪些内容.
我应该在干净的项目中开始使用什么.
请告诉我你对这三个人的看法......
谢谢你,佐尔坦
我正在使用常规会话通过linq从数据库加载一些项目.问题是它会缓存实体,并且内存负载会不必要地增加.有没有办法用无状态会话替换会话而不在客户端代码中引入许多更改?
流利的NHibernate或NHibernate,我们应该更喜欢linq支持哪一个?
这是我的单元测试(虽然毫无意义,但证明了一点
Config entity = new Config("key", "value");
Session.SaveOrUpdate(entity);
Config config = Session.Query<Config>().SingleOrDefault(c => c.Key == "key");
Assert.IsNotNull(config);
Run Code Online (Sandbox Code Playgroud)
它失败了...但是我不认为应该这样做(请注意,如果我刷新它,它不会失败,但这不是我想要的行为)
如果我用这个替换查询行
Config config = Session.Get<Config>("key");
Run Code Online (Sandbox Code Playgroud)
...通过
它绝对不会刷新(我什至将FlushMode设置为从不只是为了确定)。为什么一个人成功,另一个人不成功?这似乎不正确-我非常希望linq能够成功
查看此链接可以看到,可以使用编译后的查询来提高Linq to SQL应用程序的性能(我已经在Entity Framework中看到了其他示例):
这需要一个继承DataContext的参数-我认为NHIbernate没有,但这是这个问题的重点。
我看了这些链接:
https://nhibernate.jira.com/browse/NH-2389
但我看不到最新的确切答案。
如果有人有答案,我很想听听他们:)
我有一个具有以下方法的存储库:
IEnumerable<T> FindAll<TRelated>(Specification<T> specification,
Expression<Func<T, TRelated>> fetchExpression);
Run Code Online (Sandbox Code Playgroud)
我需要传递多个表达式。我正在考虑将签名更改为:
IEnumerable<T> FindAll<TRelated>(Specification<T> specification,
IEnumerable<Expression<Func<T, TRelated>>> fetchExpression);
Run Code Online (Sandbox Code Playgroud)
目前我正在从服务层调用该方法,如下所示:
var products = productRepository.FindAll(specification,p => p.Variants);
Run Code Online (Sandbox Code Playgroud)
但我想通过p => p.Variants,p => p.Reviews例如。然后在存储库中,我想迭代表达式并将它们添加到查询中。
有关我为什么这样做的一些背景信息,请参阅 Ben Foster 的有关使用 NHibernate 进行预加载的博客文章。
linq specification-pattern linq-to-nhibernate linq-expressions
我正在尝试使用 linq 来 nhibernate 3,我做了以下 linq 查询
var a = (from c in Session.Query<ChoiceValue>()
join Specific in
(
(from choicevaluelocale in Session.Query<ChoiceValueLocale>()
where
choicevaluelocale.UICulture == "en-GB"
select new
{
choicevaluelocale.ChoiceValue.ChoiceGroup.ChoiceGroupName,
choicevaluelocale.ChoiceValue.ChoiceValueId,
choicevaluelocale.DisplayName,
choicevaluelocale.Description
}))
on new { c.ChoiceGroup.ChoiceGroupName, c.ChoiceValueId }
equals new { Specific.ChoiceGroupName, ChoiceValueId = (Int32)Specific.ChoiceValueId } into Specific_join
from Specific in Specific_join.DefaultIfEmpty()
select new
{
c.ChoiceGroup.ChoiceGroupName,
ChoiceValueId = (Int32?)c.ChoiceValueId,
SpecificValueDisplayName = Specific.DisplayName,
SpecificValueDescription = Specific.Description,
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但是在 c# 中的 n-hibernate 上执行它时,我遇到了以下错误
The method or operation is not implemented …Run Code Online (Sandbox Code Playgroud) 我想选择Person列表,其中最后一个类别等于"B".但我不知道如何在Linq语法中编写"where子句".
我的"人"结构是:
<person>
<id>200</id>
<name>Peter</name>
<age>25</age>
<categories>
<category>
<date>2012-05-01<date>
<value>A</value>
</category>
<category>
<date>2013-01-01<date>
<value>B</value>
</category>
<category>
<date>2013-02-01<date>
<value>C</value>
</category>
</categories>
</person>
Run Code Online (Sandbox Code Playgroud) 假设我有课程Animal,Cat并且Dog.Cat并Dog继承自Animal.考虑以下代码:
var query = from animal in session.Linq<Animal>()
where
animal.Color == "White"
select animal;
Run Code Online (Sandbox Code Playgroud)
如何向上述查询添加条件以查询实体类型?比如像animal.Type == typeof(Cat).