2017-07-04 49 views
2

我努力寻找正确的方式来查询数据库中的特定实体。我有一个表TeamMember看起来如下:带参数(LINQ,SQL,C#)的表达式

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

在几个位置,我想查询我的团队是“TeamManager”。

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

所以,请帮助我与我的问题:)。 提前谢谢!

回答

3

你不能让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)); 
+0

谢谢按预期工作,我尝试了类似的东西,但在某处丢失。也许我应该指出,这只适用于IQueryable元素。 – Muarl

0

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

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