2013-05-13 27 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