gpt4 book ai didi

c# - 从 QueryOver(或 Fluent NHibernate)中获取魔法字符串?

转载 作者:行者123 更新时间:2023-11-30 15:47:41 26 4
gpt4 key购买 nike

使用 FluentNHibernate、新的 QueryOver API 和新的 Linq 提供程序的众多原因之一都是因为它们消除了“魔术字符串”或表示属性的字符串或可以在编译时表示的其他内容。

遗憾的是,我正在使用尚未升级为支持 QueryOver 或 LINQ 的 NHibernate 空间扩展。结果,我不得不结合使用 QueryOver Lambda 表达式和字符串来表示我要查询的属性等。

我想做的是——我想要一种方法来询问 Fluent 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 的东西都可能受益。

最佳答案

更新

nameof C# 6 中的运算符为此提供了编译时支持。


有一个更简单的解决方案 - 表达式。

举个例子:

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));

关于c# - 从 QueryOver(或 Fluent NHibernate)中获取魔法字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3362113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com