【高分】关于NHibernate Criteria查询中复杂类型属性的问题

jeremyyang824 2010-04-22 03:11:01
大家好,请问关于NHibernate Criteria查询中如何查询复杂类型的属性中的属性,例如:

ICriteria qry = this.Session.CreateCriteria<Inventory>();
qry.Add(NHibernate.Criterion.Expression.Eq("Supplier.SupplierName", "xxx")); //这里会报无法解析属性的错误

实体类声明:
public class Inventory : Entity<int>
{
.....
/// <summary>
/// 供应商
/// </summary>
public virtual Supplier Supplier
{
get { return this.supplier; }
set { this.supplier = value; }
}
....
}
public class Supplier : Entity<Guid>
{
....
/// <summary>
/// 供应商名称
/// </summary>
public virtual string SupplierName
{
get { return this.supplierName; }
set { this.supplierName = value; }
}
...
}
===================================
真正使用中,我是用来动态添加查询条件的,请问有什么好的办法?谢谢。

...全文
361 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeremyyang824 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 imfor 的回复:]
楼主结贴真速度;
我还没有用多表查询,都是用那个通用的类,需要多表的时候在前台写一个方法,返回需要用的值。不知道有什么坏处没有。
[/Quote]
领域模型的建立重点就在领域对象间的多重性关联,而我之所以用NH,就是因为目前除了EF4外很少有能应用于DDD开发的ORM(可能是我才疏学浅)。而领域对象和视图对象常常又是不一样的,所以。。。。
imfor 2010-04-22
  • 打赏
  • 举报
回复
楼主结贴真速度;
我还没有用多表查询,都是用那个通用的类,需要多表的时候在前台写一个方法,返回需要用的值。不知道有什么坏处没有。
jeremyyang824 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 imfor 的回复:]
qry.Add(NHibernate.Criterion.Expression.Eq("Supplier.SupplierName", "xxx")); //这里会报无法解析属性的

换成
qry.Add(NHibernate.Criterion.Expression.Eq("SupplierName", "xxx")); //这里会报无法解析属性的

SupplierName对应实体类……
[/Quote]

我后来换成遇到'.'就用子查询建立一个CreateCriteria,解决了,呵呵。初学NH,很多功能我都不知道。
jeremyyang824 2010-04-22
  • 打赏
  • 举报
回复
已经结贴了, 楼上来不及给分的兄弟辛苦了...
十分感谢大家的帮助
另外:imfor
你试下复杂属性的查询(如item.Add("User.Name","%snail%");)也会出现我同样的问题,呵呵,建议你看下楼上的链接
imfor 2010-04-22
  • 打赏
  • 举报
回复
qry.Add(NHibernate.Criterion.Expression.Eq("Supplier.SupplierName", "xxx")); //这里会报无法解析属性的

换成
qry.Add(NHibernate.Criterion.Expression.Eq("SupplierName", "xxx")); //这里会报无法解析属性的

SupplierName对应实体类里面的值,mapping里面也要配置正确。
zzxap 2010-04-22
  • 打赏
  • 举报
回复
用反射获取
imfor 2010-04-22
  • 打赏
  • 举报
回复
刚好我写过,还带分页的,给楼主参考一下了,

/// <summary>
/// 返回分页数据集
/// </summary>
/// <param name="top">查询前几条,0或null为所有</param>
/// <param name="where">查询条件,Dictionary<String, Object></param>
/// <param name="OrderBy">查询排序,Dictionary<String, Boolean>true-asc,false-desc</param>
/// <param name="_like">模糊查询,Dictionary<String, Object>,例如:item.Add("username","%snail%");</param>
/// <param name="pageSize">页码,10</param>
/// <param name="currentPageIndex">当前页</param>
/// <param name="recordCount">返回总页数</param>
/// <returns></returns>
public virtual IList<T> GetPagerList(Dictionary<String, Object> where, Dictionary<String, Boolean> OrderBy, Dictionary<String, Object> _like, int pageSize, int currentPageIndex, out int recordCount)
{
var list = Session.CreateCriteria(typeof(T));
#region 条件查询
if (where != null && where.Count > 0)
{
foreach (var item in where)
{
list.Add(NHibernate.Criterion.Expression.Eq(item.Key, item.Value));
}
}
//模糊查询
if (_like != null && _like.Count > 0)
{
foreach (var item in _like)
{
list.Add(NHibernate.Criterion.Expression.Like(item.Key, item.Value));
}
}
#endregion
#region 排序
if (OrderBy != null && OrderBy.Count > 0)
{
foreach (var item in OrderBy)
{
if (item.Value)//true-asc,false-desc
list.AddOrder(NHibernate.Criterion.Order.Asc(item.Key));
else
list.AddOrder(NHibernate.Criterion.Order.Desc(item.Key));

}
}
#endregion
recordCount = Convert.ToInt32(list.List().Count);
list.SetFirstResult((currentPageIndex - 1) * pageSize)
.SetMaxResults(pageSize);
return list.List<T>();
}
jeremyyang824 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sandy945 的回复:]
http://lwbpeter.blog.163.com/blog/static/3850821120102254244196/

看看这个
[/Quote]
谢谢指点,问题已解决。
同时也谢谢楼下的朋友。
zsuswy 2010-04-22
  • 打赏
  • 举报
回复
NHib*****,没玩过。。。。
皇城龙三 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 jeremyyang824 的回复:]
qry.Add(NHibernate.Criterion.Expression.Eq("Supplier.SupplierName", "xxx")); //这里会报无法解析属性的错误

[/Quote]

后面的那个“xxx” 把引号去掉试试。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧