2017-08-10 57 views
0

我一直試圖創建一個表達式來放在我的where子句中。使用自定義表達式構建Nhibernate子句

既然不能直接返回Func鍵(因爲NHibernate的不能用它來轉換成SQL)我試圖返回一個表達式>

要做到這一點,我試圖進入更深層次......直接使用表達式

但是..我一直在尋找沒有任何解決方案...任何人都可以幫助我嗎?

下面的代碼:

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日期過濾器...我想保持乾淨。順便說一句,我看到很多地方與您的評論類似的話題..哈哈。 – 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); 
} 

之後,我可以用語法玩,使一些先進的強類型的過濾器!

謝謝!