2017-01-31 3 views
1

私は、自分のLinq式を動的に構築し、それらを述部として使用してリストや配列の項目をフィルタリングすることについて、過去2時間の記事とその記事を読んできました。代わりに述語でLinq式を渡すには?

ここで私がこれまで持っているものの簡単な例です:

public class AWDRiskMRASCodeXref 
{ 
    public string RiskSubType { get; set; } 
    public string AcordReqCodeInt { get; set; } 
    public string MrasReqCodeInt { get; set; } 
    public string AcordReqCodePpe { get; set; } 
    public string MrasReqCodePpe { get; set; } 
    public string AcordReqCodeWeb { get; set; } 
    public string MrasReqCodeWebS { get; set; } 
} 

私は、データベースからリストを取得するために、Dapperのようなものを使用します。

var items = conn.Query<AWDRiskMRASCodeXref>("SELECT RiskSubType, AcordReqCodeInt, MrasReqCodeInt, AcordReqCodePpe, MrasReqCodePpe, AcordReqCodeWeb, MrasReqCodeWeb FROM LKUP_AWDRiskMRASCodeXref;").ToList(); 

var param = Expression.Parameter(typeof(AWDRiskMRASCodeXref), "x"); 
var member = Expression.Property(param, "AcordReqCodePpe"); //x.AcordReqCodePpe 
var constant = Expression.Constant("1004700009"); 
var body = Expression.Equal(member, constant); //x.AcordReqCodePpe == "1004700009" 
var finalExpression = Expression.Lambda<Func<AWDRiskMRASCodeXref, bool>>(body, param); //x => x.AcordReqCodePpe == "1004700009" 
finalExpression.Dump(); 

finalExpressionの「x =>(x.AcordReqCodePpe == 『1004700009』)は」LinqPadで偉大に見えますが、私はそれには、次のLINQクエリを渡すことができるように急行を行うには何が必要です?

var item = items.FirstOrDefault(finalExpression); 

問題は、クエリに.ToList()を呼び出したときにすでにクエリを「解決」しているということです、 スティーブン

答えて

1

:クエリのようなものを読むようにそれを削除します代わりに。

.NET Framework 4.6以上を使用している場合は、ボーナスのヒントとして、 memberプロパティを生成するときに、nameof演算子を使用できます。プロパティの名前を変更した場合は、ハードコードされた文字列よりもはるかに優れています。

var member = Expression.Property(param, nameof(AWDRiskMRASCodeXref.AcordReqCodePpe)); 
1

、ありがとうございました。あなたはすでにあなたが仕事に自分の表現のために行うために必要なのはそれをコンパイルし、FirstOrDefault拡張メソッドにそれを渡すことで、データベースからデータを引っ張ってきたので

var item = conn.Query<AWDRiskMRASCodeXref>("SELECT RiskSubType, AcordReqCodeInt, MrasReqCodeInt, AcordReqCodePpe, MrasReqCodePpe, AcordReqCodeWeb, MrasReqCodeWeb FROM LKUP_AWDRiskMRASCodeXref;") 
    .FirstOrDefault(finalExpression); 
+0

すでにマテリアライズされているコレクションで式を使用できませんか? –

+0

できます。 'Dump()'はボディの 'string'を返します。 'finalExpression'で' Compile() 'を呼び出す必要があります。 – JohanP

関連する問題