3

FluentNHibernate、新しい QueryOver API、および新しい Linq プロバイダーを使用する多くの理由の 1 つは、「マジック ストリング」、つまりコンパイル時に表現できるプロパティやその他のものを表す文字列を排除するためです。

悲しいことに、NHibernate の空間拡張を使用していますが、これはまだ QueryOver または LINQ をサポートするようにアップグレードされていません。その結果、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 に変換されていないものはすべてメリットがあります。

4

2 に答える 2

4

アップデート

C#6のnameof演算子は、これに対するコンパイル時のサポートを提供します。


はるかに簡単な解決策があります-式。

次の例を見てください。

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-09-01T20:23:38.537 に答える
0

私があなたの質問を理解していると仮定すると、特に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」に変更するだけです。 -これは、プロパティにそのプロパティ名自体ではなく、意味のある名前(.OtherObjectIntersectingColumnなど)がある場合にのみ実際に機能します。これには、ビルドエラーを修正するためにコードを更新する必要がないという利点があります。その時点で、クエリは次のようになります。

var x = session.QueryOver<Shuttle>().Add(SpatialRestrictions.Intersects(ShuttleHelper.OtherObjectIntersectingColumn, other_object));

オープンソースプロジェクトのエコシステムページについては、他の人がどのような種類のヘルパークラスを作成したかについての指針が得られるため、いわば車輪の再発明を行わないようにするために言及しました。

于 2010-07-29T21:45:04.440 に答える