C# 如何根据表达式结果在LINQ查询中选择值?
我正在使用EF6,我正在寻找一个解决方案来构建一个查询,该查询应该根据表达式返回的值选择其中一个字段。我在玩LINQKit库,但是这个失败了 因此,我创建了可重用谓词,用于计算DB中的逻辑:C# 如何根据表达式结果在LINQ查询中选择值?,c#,entity-framework,linq,iqueryable,linqkit,C#,Entity Framework,Linq,Iqueryable,Linqkit,我正在使用EF6,我正在寻找一个解决方案来构建一个查询,该查询应该根据表达式返回的值选择其中一个字段。我在玩LINQKit库,但是这个失败了 因此,我创建了可重用谓词,用于计算DB中的逻辑: public partial class Study { public static Expression<Func<Study, bool>> ShouldNameBeDisplayedForStaffExpression(int staffId) {
public partial class Study
{
public static Expression<Func<Study, bool>> ShouldNameBeDisplayedForStaffExpression(int staffId)
{
return study =>
(study.StudyViewAccessId == 1 && study.StudyEditAccessId == 1)
|| study.Roles.Any(y => y.StaffId == staffId);
//Here other additional logic
}
}
公共部分课堂学习
{
公共静态表达式应命名为TaffExpression(int-staffId)
{
返回研究=>
(study.StudyViewAccessId==1&&study.StudyEditAccessId==1)
||study.Roles.Any(y=>y.StaffId==StaffId);
//这里还有其他的逻辑
}
}
现在我需要根据谓词返回的结果为Name字段设置适当的值。主要要求-应该在查询级别(在IQueryable集合中)完成。该研究的核心模型是EF6实体集
IQueryable<Study> studiesCoreModelsQuery = this._dbContext.Studies;
IQueryable<StudyViewModel> query = studiesCoreModelsQuery.AsExpandable().Select(x => new StudyViewModel
{
Name = Study.ShouldNameBeDisplayedForStaffExpression(staffId).Invoke(x)
? x.Name
: "Hidden"
});
IQueryable studiesCoreModelsQuery=这一点。\u dbContext.Studies;
IQueryable query=studiesCoreModelsQuery.AsExpandable()。选择(x=>newstudyViewModel
{
Name=Study.shouldname为TaffExpression(staffId)显示。Invoke(x)
?x.姓名
:“隐藏”
});
无法理解如何在Select中获取表达式执行的结果。如果有任何帮助,我将不胜感激 伊万·斯托夫你是对的。你的建议解决了这个问题。下一步工作代码:
IQueryable<Study> studiesCoreModelsQuery = this._dbContext.Studies;
var expression = Study.ShouldNameBeDisplayedForStaffExpression(staffId);
IQueryable<StudyViewModel> query = studiesCoreModelsQuery.AsExpandable().Select(x => new StudyViewModel
{
Name = expression.Invoke(x)
? x.Name
: "Hidden"
});
IQueryable studiesCoreModelsQuery=这一点。\u dbContext.Studies;
var表达式=研究。应为塔夫表达式显示名称(staffId);
IQueryable query=studiesCoreModelsQuery.AsExpandable()。选择(x=>newstudyViewModel
{
Name=expression.Invoke(x)
?x.姓名
:“隐藏”
});
staffId来自哪里?您可以移动学习。是否应显示姓名以进行TaffExpression(staffId)
呼叫外部选择?因为它现在的位置并不是真正的名字。e、 g.var showNameExpr=研究。应为塔夫表达式显示名称(staffId)
然后在内选择doName=shownamexpr.Invoke(x)?x、 Name:“Hidden”
@IvanStoev的主要思想是在其他查询中获得重用shouldname显示forstaffexpression表达式中的逻辑的机会。该逻辑不能在查询之外执行,因为它是查询的一部分,应该基于数据库中的值应用于每个元素。staffId是一个在查询上面定义的变量,它可以是任何整数,这就是我要说的。获取查询外部的表达式,并在内部调用它。