尽管建立映射是Not.Nullable()
和Not.LazyLoad()
Nhibernate的生成OUTER JOIN用于取
出于某种原因,NH与INNER接合表两次,一次JOIN安抚WHERE,其次在OUTER JOIN到选择数据。
当然,正如我们已经加入了数据,这将是有意义的只是使用连接表...
SELECT
...Tables..
from Tasks taskentity0_,
outer Cases caseentity1_,
outer Grades gradeentit2_,
Cases caseentity5_
WHERE
....
我的LINQ查询是这样的:
IQueryable<TaskEntity> tasks = TaskRepo.Find(
t => t.DueDate <= DateTime.Now
&& (t.TaskInitials == userInitials || (t.TaskInitials == "" || t.TaskInitials == null))
&& t.Team.GST.Any
(x => x.Initials == userInitials
&& x.WorkType.WorkTypeCode == t.WorkType.WorkTypeCode
&& x.Team.TeamCode == t.Team.TeamCode
)
&& (t.Case.CaseOnHold <= DateTime.Now || t.Case.CaseOnHold == null || (t.SingleTask == "M" || t.SingleTask == "m"))
&& (t.Case.CaseMatter.StartsWith("0") || t.Case.CaseMatter.StartsWith("9"))
).Fetch(t => t.Case,FetchProvider)
我参考图:
References(x => x.Case).Column("ta_c_ref").Not.Nullable();
想法?
我们正在使用存储库模式,并重新实现了Fetch扩展方法以这种方式工作(因此传入了FetchProvider)。
而且,QueryOver<T>
是不是一个不错的选择,因为我们需要IQueryable
秒。
我使用NH 3.1。
对群众举报:
我们不再使用fetch或LINQ,我们搬到了HQL ...
/// <summary>
/// Interfaces for Fetch() statements
/// </summary>
public interface IFetchingProvider
{
IFetchRequest<TOriginating, TRelated> Fetch<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector);
IFetchRequest<TOriginating, TRelated> FetchMany<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, IEnumerable<TRelated>>> relatedObjectSelector);
IFetchRequest<TQueried, TRelated> ThenFetch<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, TRelated>> relatedObjectSelector);
IFetchRequest<TQueried, TRelated> ThenFetchMany<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, IEnumerable<TRelated>>> relatedObjectSelector);
}
public class NhFetchingProvider : IFetchingProvider
{
public IFetchRequest<TOriginating, TRelated> Fetch<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector)
{
var fetch = EagerFetchingExtensionMethods.Fetch(query, relatedObjectSelector);
return new FetchRequest<TOriginating, TRelated>(fetch);
}
public IFetchRequest<TOriginating, TRelated> FetchMany<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, IEnumerable<TRelated>>> relatedObjectSelector)
{
var fecth = EagerFetchingExtensionMethods.FetchMany(query, relatedObjectSelector);
return new FetchRequest<TOriginating, TRelated>(fecth);
}
public IFetchRequest<TQueried, TRelated> ThenFetch<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, TRelated>> relatedObjectSelector)
{
var impl = query as FetchRequest<TQueried, TFetch>;
var fetch = EagerFetchingExtensionMethods.ThenFetch(impl.NhFetchRequest, relatedObjectSelector);
return new FetchRequest<TQueried, TRelated>(fetch);
}
public IFetchRequest<TQueried, TRelated> ThenFetchMany<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, IEnumerable<TRelated>>> relatedObjectSelector)
{
var impl = query as FetchRequest<TQueried, TFetch>;
var fetch = EagerFetchingExtensionMethods.ThenFetchMany(impl.NhFetchRequest, relatedObjectSelector);
return new FetchRequest<TQueried, TRelated>(fetch);
}
}
public static IFetchRequest<TOriginating, TRelated> Fetch<TOriginating, TRelated>(this IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector, Func<IFetchingProvider> FetchingProvider)
{
return FetchingProvider().Fetch(query, relatedObjectSelector);
}
存储库模式杀死了NHibernate的功能。我的意见和其他许多人都有同样的想法。 – CrazyCoderz 2012-04-20 14:01:02
这将有助于看到获取扩展源代码.. – Hoghweed 2012-12-17 15:20:04
从历史更新 - 铭记在心,代码现在已近一年的时间,并未被使用。 – 2012-12-17 16:30:56