NHibernate 4升级 – 无法同时获取多个行李
我尝试将NH 3.3.1.4000升级到最新版本的NH 4.0.2.4000,我遇到了FetchMany和ThenFetchMany的问题。
在这篇文章中,我了解到这个旧function不再有效, 通过NHibernate 4升级破坏了变化 。
在新的NH版本上进行这种获取的正确方法是什么?
代码示例:
var IdsList = new List { /* Some Ids */ }; session.Query() .FetchMany(x=>x.B_ObjectsList) .ThanFetchMany(x=>x.C_ObjectsList) .Where(x=>IdsList.Contains(x=>x.Id)) .ToList();
类别:
Public Class A { public int Id {get;set;} public IList B_ObjectsList{get;set;} } Public Class B { public int Id {get;set;} public IList C_ObjectsList {get;set;} } Public Class C { public int Id {get;set;} }
制图:
大概
var IdsList = new List { /* Some Ids */ }; var results = session.Query() .FetchMany(x => x.B_ObjectsList) .Where(x=>IdsList.Contains(x.Id)) .ToList(); // initialize C_ObjectsList var bIds = results.SelectMany(x => x.B_ObjectsList).Select(b => b.Id).Distinct().ToList(); session.Query() .FetchMany(x => x.C_ObjectsList) .Where(b => bIds.Contains(b.Id)) .ToList(); return results;
如果B有A的引用你可以这样做:
var IdsList = new List { /* Some Ids */ }; var results = session.Query() .Fetch(a => a.B_ObjectsList) .Where(a => IdsList.Contains(a.Id)) .ToList(); // initialize C_ObjectsList var aQuery = session.Query() .Where(x => IdsList.Contains(x.Id)); session.Query() .Fetch(b => b.C_ObjectsList) .Where(b => aQuery.Contains(bA) .Prefetch();
这样做的好处是不受DB的最大参数的限制,在SQL服务器中默认为2100.而不是ToList()
,我使用这个扩展方法:
static public void Prefetch(this IQueryable query) { // ReSharper disable once ReturnValueOfPureMethodIsNotUsed query.AsEnumerable().FirstOrDefault(); }
- 数学解释为什么Decimal的转换为Double并且Decimal.GetHashCode将相等的实例分开
- 检查richtextbox上的选定文本是否全部为粗体
- 在C#中的界面内使用时,’new’关键字的含义是什么?
- 为Firebase生成JWT
- 使用System.Web.Script.Serialization.JavascriptSerializer反序列化JSON – 如何?
- 使用Base类将字符串传递给DbContext的构造函数不会设置该值
- 确定对象是否派生自集合类型
- 如何为二进制格式化程序创建SerializationBinder,以处理类型从一个程序集和名称空间到另一个程序集和名称空间的移动
- 是否可以在不使用分析器的情况下跟踪C#应用程序中的内存使用情况?