2013-04-01 42 views
-1

我有这样的方法:LINQ动态情况

private string GetLanguage(String currentLanguage, dynamic entity) 
{ 
    return (currentLanguage == "de" ? entity.language.German : 
    currentLanguage == "fr" ? entity.language.French : 
    currentLanguage == "en" ? entity.language.English : 
    entity.language.English); 
} 

我需要这个返回做这样的事情的SQL语句的LINQ表达式:

select (case when [french] is null then [english] else [french] end) as language 
from 

我怎样才能做到这一点?

韩国社交协会

编辑:

更具体:

我有这样的事情:

myId = 1; 

from objects in context.Objects 
          where objects.Id== myId 
select new 
          { 
           MyObject = new Models.MyObjects() 
           { 
            Id = objects.ScrId, 
            Title = LanguageFactory.GetLabelLanguage(objects.Labels) 
           } 
          }).FirstOrDefault(); 

而且MyObject.Title必须有明确的语言(英语,法文,荷兰文等)。 在SQL我下定决心,通过做这样的事情:

select id, (case when [french] is null then [english] else [french] end) as language 
from table 

我如何做一个LINQ表达式可以被转换为类似于上面的SQL查询?

+0

你想让GetLanguage方法返回一个linq表达式吗? – bas

+0

我可以问问如果你知道当前的语言,你为什么试图产生这样的SQL。 –

+0

是的,这将用于主查询中,具有以下内容: 从表 – user2219609

回答

2

您将无法在Linq-to-SQL中调用任意函数。但是你可以使用一个Expression,像这样:

private Expression<Func<DbObject, MyObject>> GetObjectWithLanguage = 
    e => new MyObject 
    { 
     Id = e.ScrId, 
     Title = e.currentLanguage == "de" ? e.Labels.language.German : 
       e.currentLanguage == "fr" ? e.Labels.language.French : 
       e.currentLanguage == "en" ? e.Labels.language.English : 
       e.Labels.language.English 
    }; 

... 
var results = context.Objects.Where(e => e.Id == myId).Select(GetObjectWithLanguage); 

这将使用在实体本身currentLanguage属性,以确定哪些返回。但是,如果你想通过currentLanguage从你的C#代码的参数,试试这个:

private Expression<Func<DbObject, MyObject>> GetObjectWithLanguage(string currentLanguage) 
{ 
    if (currentLanguage == "de") 
    { 
     return e => new MyObject 
     { 
      Id = e.ScrId, 
      Title = e.Labels.language.German 
     } 
    } 
    else if (currentLanguage == "fr") 
    { 
     return e => new MyObject 
     { 
      Id = e.ScrId, 
      Title = e.Labels.language.French 
     } 
    } 
    ... 
} 

var results = context.Objects.Where(e => e.Id == myId).Select(GetObjectsWithLanguage("de")); 

如果你想创建一个通用的方法,我建议你使用仿制药,而不是dynamic参数,例如,假设你有这样一个接口:

public interface ILanguageAware 
{ 
    string CurrentLanguage { get; } 
    string English { get; } 
    string French { get; } 
    string German { get; } 
} 

public class ObjectWithLanguage<T> where T : ILanguageAware 
{ 
    public T OriginalObject { get; set; } 
    string LanguageText { get; set; } 
} 

public Expression<Func<T, ObjectWithLanguage<T>>> GetObjectWithLanguage<T>() where T : ILanguageAware 
{ 
    return x => new ObjectWithLanguage<T> 
      { 
       OriginalObject = x, 
       LanguageText = x.CurrentLanguage == "de" ? x.German : 
           x.CurrentLanguage == "fr" ? x.French : 
           ... 
      } 
} 

// extension method for convenience 
public static IQueryable<ObjectWithLanguage<T>> SelectWithLanguage<T>(this IQueryable<T> queryable) 
{ 
    return queryable.Select(GetObjectWithLanguage<T>()); 
} 

var results = context.Objectss.Where(e => e.Id == myId).SelectWithLanguage(); 
+0

首先,tks。 其次,我的目标是拥有一个接收动态参数的通用公共方法,因为我有很多具有相同语言列的模型标签。 我当前的方法返回一个字符串,我希望它返回一个LINQ表达式。 公共字符串使用getLanguage(字符串currentLanguage,动态实体) { 回报(currentLanguage == “德” entity.language.German:?? currentLanguage == “FR” entity.language.French: currentLanguage ==“EN “?entity.language.English: entity.language。英语); } 我很困惑如何将您的代码转换为我的目标。 – user2219609

+0

当前我有以下方法: public expression > GetObjectWithLanguage(dynamic entity) { string currentLanguage = GetContextLanguage(); 表达式> ret = e => currentLanguage ==“de”? entity.German: currentLanguage ==“fr”? entity.French: currentLanguage ==“en”? entity.English: entity.English; return ret; } 出现以下错误,“表达式树可能不包含动态操作” – user2219609

+0

如果没有更多信息很难分辨。您可能无法使用'dynamic'参数,但通用的方法可能会起作用。我已经用一些代码更新了我的答案,这些代码会为您提供一些指示。 –