2013-05-13 29 views
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; 
} 

回答

1

我發現的另一種方式使用通用方式返回相同的結果。

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; 
    } 

也許有人可以使用這個作爲一個sollution

此可以稱爲跟隨

變種結果= QueryableTable.IncludeTranslation(T => t.FieldToTranslate);

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); 
+0

Hello qujck, 你能告訴我應該如何調用這個方法。 我的意思是我應該填寫fieldToTranslate參數。 來自翻譯表的字段應該與來自IQueryable的字段相比較 Gabe 2013-05-13 14:48:04

+0

您好,謝謝您的回答。用你的例子,我現在可以編譯,但我在運行時得到一個錯誤。 LINQ to Entities不支持LINQ表達式節點類型「Invoke」。這可能是因爲實體框架無法將func轉換爲sql語句。有什麼建議麼? – Gabe 2013-05-13 20:05:11

+0

@Salako我想你可能會走運:-( – qujck 2013-05-13 21:24:44