4

データベースでクエリを実行するために nhibernate と linq を使用するアプリケーションがあります。すべて正常に動作しますが、次のモデルがマップされています (自動関連):

public class A
{
    public virtual int Id { get; set; } 
    public virtual A ParentA { get; set; }  
}

一部の情報を処理するメソッドがあり、このメソッドはcount整数パラメーターを取ります。countフィルターを作成するために ParentA プロパティの時間にアクセスする方法があるかどうかを知りたいです。

protected void Proccess(int count, int id)
{
    var query = session.Query<A>();

    // I would like to access, the number of count variable in parentA property, something like:
    // for sample: if count is 3, I would like a query like: 
    query.Where(x => x.ParentA.ParentA.ParentA.Id == id);

    // maybe something like this:
    for (int i = 0; i < count; i++)
    {
        query.Where(x => x.ParentA.ParentA.ParentA.Id == id);   
    }

    var result = query.ToList();

    // continue method...
}

この種のラムダ式を作成する方法はありますか?

4

2 に答える 2

2

このようなものが動作するはずです:

protected void Process(int count, int id)
{
    var query = session.Query<A>().Where(BuildFilter(count,id));
    var result = query.ToList();
}

private static Expression<Func<A, bool>> BuildFilter(int count, int id)
{
   var x = Expression.Parameter(typeof(A), "x");

   Expression instance = x;
   if (count != 0)
   {
      var prop = typeof(A).GetProperty("ParentA");
      while (count > 0)
      {
         instance = Expression.Property(instance, prop);
         count--;
      }
   }

   var instanceId = Expression.Property(instance, "Id");
   var compareId = Expression.Constant(id);
   var body = Expression.Equal(instanceId, compareId);

   return Expression.Lambda<Func<A, bool>>(body, x);
}
于 2013-06-04T18:24:57.183 に答える