使用FluentNHibernate、新的QueryOver API和新的Linq的原因之一都是因为它们消除了“魔术字符串”,或者表示属性或其他在编译时可以表示的东西的字符串。
遗憾的是,我正在为NHibernate使用空间扩展,该扩展还没有升级到支持QueryOver或LINQ。因此,我不得不使用QueryOver Lambda表达式和字符串的组合来表示我想要查询的属性等。
我想做的是--我想问一下流利的NHibernate (或者NHibernate QueryOver API)什么是神奇的字符串“应该是什么。”下面是一个伪代码示例:
目前,我会写--
var x = session.QueryOver<Shuttle>().Add(SpatialRestrictions.Intersects("abc", other_object));
我想写的是--
var x = session.QueryOver<Shuttle>().Add(SpatialRestriction.Intersects(session.GetMagicString<Shuttle>(x => x.Abc), other_object));
有这样的东西可用吗?写起来会很困难吗?
编辑: --我只想指出,这不仅适用于空间--实际上,任何尚未转换为QueryOver或LINQ的东西都可能受益。
发布于 2010-09-01 12:23:38
更新
国名 6中的C#操作符为此提供了编译时支持。
有一个简单得多的解决方案--表达式。
以下列例子为例:
public static class ExpressionsExtractor
{
public static string GetMemberName<TObj, TProp>(Expression<Func<TObj, TProp>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
return null;
return memberExpression.Member.Name;
}
}
以及使用情况:
var propName = ExpressionsExtractor.GetMemberName<Person, int>(p => p.Id);
ExpressionsExtractor只是一个建议,您可以将该方法包装在您想要的任何类中,可能是作为扩展方法,或者最好是一个无静态类。
您的例子可能看起来有点像这样:
var abcPropertyName = ExpressionsExtractor.GetMemberName<Shuttle, IGeometry>(x => x.Abc);
var x = session.QueryOver<Shuttle>().Add(SpatialRestriction.Intersects(abcPropertyName, other_object));
发布于 2010-07-29 13:45:04
假设我理解您的问题,您可能希望为每个实体提供一个助手类,包括列名、属性名和其他有用的东西,特别是如果您想使用ICriteria搜索。http://nhforge.org/wikis/general/open-source-project-ecosystem.aspx有很多可能有帮助的项目。NhGen (http://sourceforge.net/projects/nhgen/)创建非常简单的助手类,这些类可能有助于为您提供可能需要的设计路径。
澄清编辑:跟随“我不明白”的评论
总之,我还没有想到你有什么解决办法。QueryOver项目还没有达到您想要的程度。因此,同时作为一种可能的解决方案,删除神奇的字符串构建了一个助手类,这样您的查询就变成了
var x = session.QueryOver<Shuttle>().Add(SpatialRestrictions.Intersects(ShuttleHelper.Abc, other_object));
这样,您的魔术字符串就隐藏在其他属性之后(我选择了.Abc演示,但我相信您会更好地了解您想要的是什么),那么如果"abc“更改(比如"xyz”),您要么将属性名从.Abc更改为.Xyz,然后生成错误来显示您需要更新代码的位置(就像使用lambda表达式一样),或者只是将.Abc属性的值更改为"xyz“--只有当您的属性有一些有意义的全名(如.OtherObjectIntersectingColumn等)时,才能真正工作,而不是属性名称本身。这样做的好处是不必更新代码来更正构建错误。此时,您的查询可能是
var x = session.QueryOver<Shuttle>().Add(SpatialRestrictions.Intersects(ShuttleHelper.OtherObjectIntersectingColumn, other_object));
我提到了开源项目生态系统页面,因为它可以为您提供一些提示,说明其他人创建了哪些类型的助手类,这样您就不会再发明轮子了。
https://stackoverflow.com/questions/3362113
复制相似问题