我一直在努力解决这个问题,我希望这里有人可以帮助我。我有一个使用 EF 5 和通用 repo/UoW 设置的 VB.NET(.NET 4.0,VS 2012)编写的项目。我需要动态创建谓词以传递给我的仓库的 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")
或者和上面的一样复杂。