クライアントプロパティを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クラスを使用する別の方法はありますか?助けていただければ幸いです。