带参数的表达式 (LINQ, SQL,C#)



我努力寻找正确的方法来查询数据库中的特定实体。我有一个表格团队成员,如下所示:

public class TeamMember
{
public Guid TeamId { get; set; }
public Guid ManagerUserId  { get; set; }
...       
}

在几个职位上,我想在我的团队中查询"团队经理"。

public TeamMember GetTeamManager(Guid teamId, List<TeamMember> teamMembers)
{
return teamMembers.FirstOrDefault(member => member.TeamId == teamId && member.ManagerUserId == null);
}

如果我想在表达式中使用方法,例如(不是真正的代码),

...
// IQueryable<TeamMember>
teamMembers.Where(member => member.team.GetTeamManager(teamId, teamMembers))

它适用于内存对象,但这不能与实体框架结合使用,因此真正的数据库对象。

因此,我正在尝试静态表达式,但我没有找到任何将静态表达式与变量结合使用的解决方案,例如:

// this should be an ideal solution
Expression<Func<TeamMember, bool>> exp = teammember => teamMember.TeamId == **CUSTOM_VARIABLE** && teamMember.ManagerUserId == null;
teamMembers.Where(exp)   

我想重用表达式,但我也希望能够修改变量。我的目标是避免在两者之间创建一个对象,因为以下内容会起作用,但效率较低(如果我错了,请纠正我)

teamMembers.ToList().Where(member => member.team.GetTeamManager(teamId, teamMembers))

所以请帮助我解决我的问题:)。 提前谢谢你!

由于需要捕获变量,因此不能将exp设置为属性,但可以将其设置为返回Expression<Func<TeamMember,bool>>的函数:

Expression<Func<TeamMember,bool>> MakeMemberExpression(Guid teamId) {
return teammember => teamMember.TeamId == teamId && teamMember.ManagerUserId == null;
}

甚至

Expression<Func<TeamMember,bool>> MakeMemberExpression(Guid teamId) =>
teammember => teamMember.TeamId == teamId && teamMember.ManagerUserId == null;

您可以按如下方式使用它:

var members = teamMembers.Where(MakeMemberExpression(teamId));

您可以创建一个在IQueryable上运行的函数。

public TeamMember GetTeamManager(IQueryable<TeamMember> baseQuery,Guid teamId)
{
return baseQuery.FirstOrDefault(member => member.TeamId == teamId && member.ManagerUserId == null);
}

最新更新