[英]How to use a dynamic expression for a value in an Entity Framework select clause
我不確定我是在正確地問這個問題還是以一種可以理解的方式問這個問題,但是在這里:
我試圖找出一種動態的方法來設置數據庫上下文中的選擇值。 我在整個代碼的一百多個地方都使用了我稱之為CodeTableValuePOCO的東西,我不想每次都需要指定整個表達式(尤其是用於查找CodeName
值的語法)。 因此,我嘗試使用這樣的表達式來動態生成它。
internal static Expression<Func<CodeTableValue, CodeTableValuePOCO>> GetCodeTableValueSelectorExpression(int languageId) {
return x => new CodeTableValuePOCO
{
Code = x.Code,
// Check if there are any translations for the code name
CodeName = x.Translations != null
// If there are, check if there is a translation for user's language
? x.Translations.LanguageTranslationTexts.Count(t => t.Language_ID == languageId) > 0
// If there is a translation, take the first for the given language
? x.Translations.LanguageTranslationTexts.FirstOrDefault(t => t.Language_ID == languageId).Text
// Else, default to codeName
: x.CodeName
// Else, default to codeName
: x.CodeName,
CodeTableId = x.CodeTable.CodeTableID,
Id = x.CodeTableValueID,
Key = x.CodeTable.Key,
ParentId = x.ParentID
};
}
但是,我不知道如何在代碼中使用以上表達式。 我認為如果我只想查找CodeTableValuePOCO
,那將是CodeTableValuePOCO
,但是CodeTableValuePOCO
嵌入在較大的選擇中,如下面的示例所示。 顯然,這是行不通的,因為該程序期望使用CodeTableValuePOCO,但是獲得了表達式。
using (MyDbContext db = new MyDbContext()) {
return db.Notifications
.Where(x => x.id == 1)
.Select(x => new NotificationPOCO
{
Id = x.Id,
Message = x.Message,
//This part is, obviously, not working
Type = code.GetCodeTableValueSelectorExpression(2)
})
.ToList();
}
}
在其他表達式中使用表達式沒有自然的C#編譯時支持。
您需要一些表達式合成庫-例如LINQKit 。 它說明了問題,並使用自定義Invoke
和AsExpandable
擴展方法解決了該問題。 您的解決方案是這樣的(安裝軟件包后):
using LinqKit;
using (MyDbContext db = new MyDbContext()) {
var codeTableValueSelector = GetCodeTableValueSelectorExpression(2);
return db.Notifications.AsExpandable()
.Where(x => x.id = 1)
.Select(x => new NotificationPOCO
{
Id = x.Id,
Message = x.Message,
Type = codeTableValueSelector.Invoke(x) // or x.CodeTable? not sure from the sample code
})
.ToList();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.