2013-04-01 39 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'參數,但通用的方法可能會起作用。我已經用一些代碼更新了我的答案,這些代碼會爲您提供一些指示。 –