我一直在努力解决这个问题,我希望有人可以帮助我。我有一个用VB.NET(.NET 4.0,VS 2012)编写的项目,该项目使用EF 5和通用repo / UoW设置。我需要动态创建谓词以传递给我的repo的Where()函数,该函数实现简单:
Public Function Where(predicate As Expression(Of Func(Of T, Boolean))) As IEnumerable(Of T) Implements IDatabaseRepository(Of T).Where
Return _context.GetDBSet(Of T).Where(predicate).ToList()
End Function
根据用户输入的条件,谓词可能会有些复杂。这是我试图动态构建的谓词的一个例子。
Function(p) p.ProductCategoryID = 56 AndAlso p.ProductLabels.Any(Function(pl) pl.ProductID = p.ProductID AndAlso (pl.LabelID = 2 OrElse pl.LabelID = 3)) AndAlso p.ProductLabels.Any(Function(pl) pl.ProductID = p.ProductID AndAlso pl.LabelID = 27) AndAlso p.ProductPrices.Any(Function(pp) pp.ProductID = p.ProductID AndAlso pp.PriceTypeID = 2 AndAlso pp.Price > 10)
如果我将此传递给Where函数,我会得到我期望的结果。但我无法弄清楚如何动态创建它。我玩过PredicateBuilder,但是我无法正常工作。
谓词可以简单如下:
Function(p) p.SKU.StartsWith("ABC")
或者像上面那样复杂。