Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据表达式结果在LINQ查询中选择值?_C#_Entity Framework_Linq_Iqueryable_Linqkit - Fatal编程技术网

C# 如何根据表达式结果在LINQ查询中选择值?

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) {

我正在使用EF6,我正在寻找一个解决方案来构建一个查询,该查询应该根据表达式返回的值选择其中一个字段。我在玩LINQKit库,但是这个失败了

因此,我创建了可重用谓词,用于计算DB中的逻辑:

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)
然后在
内选择
do
Name=shownamexpr.Invoke(x)?x、 Name:“Hidden”
@IvanStoev的主要思想是在其他查询中获得重用shouldname显示forstaffexpression表达式中的逻辑的机会。该逻辑不能在查询之外执行,因为它是查询的一部分,应该基于数据库中的值应用于每个元素。staffId是一个在查询上面定义的变量,它可以是任何整数,这就是我要说的。获取查询外部的表达式,并在内部调用它。