0

Code First で EntityFramework 5 を使用しています。

以下のPOCOをご覧ください。

public class Product
{
    [Key]
    public Guid Id { get; set; }

    public string Name {get; set; }  // e.g. en=Screwdriver;de=Schraubenzieher;fr=Tournevis

    /// <summary>
    /// This will always return a valid string.
    /// </summary>
    /// <param name="languageCode"></param>
    /// <returns></returns>
    public string GetLocalizedName(string languageCode)
    {
        ...
    }
}

ご覧のとおり、各製品には「多言語」の名前があり、この 1 つの文字列内にさまざまな翻訳がすべて含まれています。

LINQ を使用して特定の言語で製品を並べ替える簡単な方法がわかりません。私が探しているコードは次のようになります (英語名に基づいてソートされたコレクションが必要であると仮定します):

var sortedProducts = from p in Context.Products
                     orderby p.GetLocalizedName("en")
                     select p;

しかし、.ToList() などでアイテムを反復処理するとすぐには機能しません。店の表現。」

これを解決する方法についてエレガントなアイデアを持っている人はいますか? 結果は再び Product 型の IQueryable でなければなりません (他の方法がない場合は、製品のリストも扱うことができます)。

みんなありがとう!

4

3 に答える 3

3

結果は再び Product 型の IQueryable でなければなりません

それはうまくいきません。string GetLocalizedName()は C# メソッドであるため、cannot be translated into a store expressionエラーが発生します。

(他に方法がない場合は、製品のリストも使用できます)。

現在、それを行う必要があります:

  var sortedProducts = from p in Context.Products
                 .ToList()    // switch to IEnumerable and suffer the loss in performance
                 orderby p.GetLocalizedName("en")
                 select p;

代替案:

  • GetLocalizedName()ストアド プロシージャとして実装し、マッピングを修正する
  • データ モデルを再構築します。テーブルを追加し { ProductId, LanguageCode, Description }ます。
于 2013-09-19T10:15:24.063 に答える
1

注文はクライアント側で行われることに注意してください。

var sortedProducts = (from p in Context.Products
                 select p)
                 .AsEnumerable()
                 .OrderBy(p => p.GetLocalizedName("en"));
于 2013-09-19T10:12:49.773 に答える
1

一人の名前で翻訳を管理するのは大変な仕事だと思います。言語名をマスター/ディテールに分割します。

string code = "de";

var sortedProducts = from p in Context.Products
                     join l in Context.ProductNames on p.id equals l.product_id
                     where l.languageCode == code 
                     // you can uncomment the code below to get the english always if the translation in 'code' (german) isn't available, but you need to eliminate duplicates.
                     // || l.languageCode == "en"
                     orderby l.localizedName
                     select new { p.id, p.whatever, l.localizedName };

このようにして、クエリはサーバー側で実行されます。また、未翻訳の名前を検索するクエリを作成できます。

于 2013-09-19T10:19:01.730 に答える