2017-08-10 6 views
0

私はwhere句を入れる式を作成しようとしています。カスタム式でNhibernate句を作成する

(NHibernateのは、SQLに変換するためにそれを使用することはできませんので)私が直接、私は式を返すようにしようとしているのFuncを返すことはできませんので>

それを行うには、私はに行くことを試みましたより深いレベル...式を直接使用する

しかし、私は何の解決策もなしに検索してきました。ここで

コードです:私の式を作成する方法を...

private static void Teste() 
{ 
    var repo = new Repository<ViewRelatorioOrdemServico>(MockDevDatabase.CurrentSession()).Queryable(); 
    var filtro = DateTime.Now.AddDays(-15); 
    repo = repo.Where(FilterDateDe(x => x.DataCriacao.Value, filtro)); 
    foreach (var item in repo) 
    { 
     Console.WriteLine(item.NumeroOS); 
    } 
} 

public static Expression<Func<ViewRelatorioOrdemServico, bool>> FilterDateDe(Expression<Func<ViewRelatorioOrdemServico, DateTime>> exp, DateTime dataDe) 
{ 
    var right = Expression.Constant(dataDe, typeof(DateTime));    
    return Expression.GreaterThanOrEqual(exp, right); 
} 

私の質問がある>

私はさまざまな方法の多くをしようとしてきた...それを行うには、いくつかのフレームワークを見つけました..しかし、私はそれらを避けようとしています...これに私自身の解決策を実装します。

これらは学術目的のためにイワンに、特別を助けた人のための

+0

なぜ表現を直接使用しないのですか?私は 'query.Where(x => x.DataCriacao.HasValue && x.DataCriacao.Value> = filtro);'を意味します。それとも動的なものが必要なのでしょうか? –

+0

私はそれを動的にする必要があります...私はいくつかの場所を持っている... 16の日付フィルタ...と私はそれをきれいに保ちたい。 Btw、私は似たような話題であなたのコメントとたくさんの場所を見た。 – Revista

+1

['Expression.Lambda'](https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.lambda(v = vs.110).aspx)メソッドを見てください。 'Return Expression.Lambda >(Expression.GreaterThanOrEqual(exp.Body、right)、exp.Parameters);' –

答えて

1

感謝です!

最終的な答えは、次のコードである。その後L

public static Expression<Func<ViewRelatorioOrdemServico, bool>> FilterDateDe(Expression<Func<ViewRelatorioOrdemServico, DateTime>> exp, DateTime dataDe) 
{ 
    var right = Expression.Constant(dataDe, typeof(DateTime)); 
    return Expression.Lambda<Func<ViewRelatorioOrdemServico, bool>>(Expression.GreaterThanOrEqual(exp.Body, right), exp.Parameters); 
} 

、私は構文で再生すると、いくつかの先進的な強く型付けされたフィルタを作ることができます!

ありがとうございます!

関連する問題