2017-07-04 51 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); 
}