2017-07-04 12 views
2

私のデータベースの特定のエンティティを照会する正しい方法を見つけるのに苦労します。パラメータ(LINQ、SQL、C#)を使用した式

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

私は私のチームで「TeamManager」を照会したいいくつかの位置で:私は次のように見えるテーブルTeamMemberを持っています。

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

それはメモリオブジェクトにのため正常に動作しますが、これは、エンティティフレームワークとの組み合わせでは動作しません。 、本当のdbオブジェクトです。

そこで私は、静的な表現を試してましたが、私は、変数などとの組み合わせで静的表現を使用する任意の解決策を見つけることができませんでした:

// 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); 
} 
関連する問題