1

クライアントプロパティをSQLにマッピングする方法について、DamienGの記事(http://damieng.com/blog/2009/06/24/client-side-properties-and-any-remote-linq-provider )を見ました。私はこの記事を実行しました、そして私はそれに大きな可能性を見ました。クライアントのプロパティをSQLに確実にマッピングすることは素晴らしいアイデアです。

しかし、文字列を連結するよりも少し複雑なものにこれを使用したかったのです。Atmは、Businessオブジェクトに多言語を導入しようとしています。既存のすべてのlinq2sqlクエリをそのままにして、多言語プロパティのコードを変更するだけで、CurrentUICultureで指定されたプロパティが実際に返されるようにしたいと思います。

最初のアイデアは、これらのフィールドをXMLに変更してから、Object.Property.Elements()。Where(...)を試すことでしたが、SQLに変換できなかったため、Elements()でスタックしました。XMLフィールドは実際には文字列と見なされ、アプリサーバー上でのみXElementsになることをどこかで読みました。したがって、この方法では、フィルタリングはDBではなくアプリサーバー上で行われます。フェアポイント、それはこのようには機能しません。別のことを試してみましょう...2番目のアイデアは、PolyGlotsテーブル(http://weblogic.sys-con.com/node/102698?page=0,1から取得した名前)、PolyGlotTranslationsテーブル、およびカルチャを作成することでした。表。PolyGlotsは各国際化されたプロパティから参照されます。このように私は例えば言いたかった:

private static readonly CompiledExpression<Announcement, string> nameExpression
    = DefaultTranslationOf<Announcement>
        .Property(e => e.Name)
        .Is(e=> e.NamePolyGlot.PolyGlotTranslations
          .Where(t=> t.Culture.Code == Thread.CurrentThread.CurrentUICulture.Name)
          .Single().Value
        );

残念ながら、ここで、Where()関数をsqlに変換できないというエラーが発生します。これは、実行されると確信していたため、少し残念です。IEntitySetは基本的にIEnumerableであり、IQueryableではないので、失敗していると思います。

この目標を達成するためにcompiledExpressionsクラスを使用する別の方法はありますか?助けていただければ幸いです。

4

2 に答える 2

1

まず、XML拡張機能をSQLに取り込もうとはしませんでした。彼らは理由のために異なる獣のために設計されました。

適切なデータベース戦略を使用すれば、単一のlinqクエリセットを使用することができます。(新しいモデルに合わせて調整する必要がある場合があります。)たとえば、言語によって異なる説明フィールドがある場合は、選択した言語に基づいて正しい説明を返すビューを作成します。次に、linqクエリをテーブルではなくビューにポイントします。

追加情報:多言語フィールドを含むビューは、アイテムごとに1つだけです。各多言語フィールドには、言語テーブルキーと元のオブジェクトのキーを複合キーとして使用する独自のテーブルがあります。ビューは、クエリを実行するためにすべてのテーブルを1つの場所に結合します。ここで、製品ビューがあるとします。そのビューをProductId=1でクエリすると、実際には言語と同じ数の製品のコピーが表示されます。

これで、Linqクエリには、言語によって制限するパラメータが常に含まれます。言語の説明が欠落している場合でも元に戻せるように、クエリでは必ず外部結合を使用してください。(または、選択した言語の設定にアイテムを意図的に制限するために使用しないでください。

ストアドプロシージャを作成して、ビューをテーブルのように機能させるように更新する機能を開くことができます。(または、ストアドプロシージャをそこに接続することで、ほとんどのARMフレームワークでこれを行うことができます。)

于 2010-04-02T19:46:17.380 に答える
0

実際の問題は、使用されている場所がSystem.Linq名前空間のものではなく、別の名前空間であり、efの式の訪問者が翻訳できないことでした。

于 2013-02-18T15:09:29.157 に答える