1

Linq クエリで指定された列の変換を含む IQueryable の拡張メソッドを作成するのに問題があります。

以下のクエリがあるとします。翻訳を取得したい列を指定して、CFG_Article IQueryable でメソッド IncludeTranslation を呼び出したいと思います。誰かが正しい方向に私を助けることができますか?

var translations = 
    from t in UoW.CFG_TRANSLATION.GetAll()
    select t;

var result = (
    from a in UoW.CFG_ARTICLE.GetAll()
    select new
    {
        a,
        translation = translations
            .Where(t=> t.TR_TEXT == a.AR_NAME).FirstOrDefault()
    });

これまでに出てきたのは以下のコードだけですが、これはコンパイルされません。

public static IQueryable IncludeTranslation<T>(
        this IQueryable<T> query, 
        Expression<Func<t, bool>> fieldToTranslate)
{
    // this will get an IQueryable of CFG_TRANSLATION
    var translations = GetTranslations(); 

    var result = (
        from q in query
        select new
        {
            q,
            translation = translations
                .Where(t=> t.TR_TEXT == fieldToTranslate)
                .FirstOrDefault()
        });
    // even better is to return all fields from query 
    // + the TR_TRANSLATION field from the translations table

    return result;
}
4

2 に答える 2

1

これを試してください(クラス名はCFG_ARTICLEとCFG_TRANSLATIONであると推測する必要があります-必要に応じて置き換えてください)

public static IQueryable IncludeTranslation(
            this IQueryable<CGF_ARTICLE> query, 
            Func<CFG_ARTICLE, CFG_TRANSLATION, bool> fieldToTranslate)
{
    var translations = GetTranslations();

    var result =
        from a in query
        select new
        {
            a,
            translation = translations
                .Where(t => fieldToTranslate(a, t))
                .FirstOrDefault()
        };

    return result;
}

このように呼び出す

var result = query.IncludeTranslation(
    (article, translation) => article.TR_TEXT == translation.AR_NAME);
于 2013-05-13T14:21:10.077 に答える
1

Generic Way を使用して同じ結果を返す別の方法を見つけました。

    public static IQueryable IncludeTranslation<S>(this IQueryable<S> source, Expression<Func<S, string>> keyField)
        where S : class
    {
        IQueryable<CFG_TRANSLATION> translations = GetTranslations();
        var trans = source.GroupJoin(translations, keyField, t => t.TR_TEXT, (s, t) => new { Source = s, Translations = t });
        var result = trans.Select(t => new { 
            Source = t.Source, 
            Translation = t.Translations
                            .FirstOrDefault() 
        });
        return result;
    }

多分誰かがこれを解決策として使うことができます

これは次のように呼び出すことができます

var Result = QueryableTable.IncludeTranslation(t => t.FieldToTranslate);

于 2013-05-14T19:19:58.653 に答える