2

如果我有一个Func<T, T, bool>告诉我如何比较两个 T,如

var comparer = (a, b) => 
    a.IdPart1 == b.IdPart1 && a.IdPart2 == b.IdPart2;

我想使用这个和 T 的具体实例来创建一个Expression<Func<T, bool>>用作 Where() 的谓词,例如

T instance = GetSomeT();
TRepository.GetAll().Where(x => 
    x.IdPart1 == instance.IdPart1 && x.IdPart2 == instance.IdPart2);

但当然是动态的,这样我就可以改写

var predicate = something depending on comparer and instance;
TRepository.GetAll().Where(predicate);

可能吗?

更酷的是,如果我可以仅从 T 动态创建谓词,并且and在 KeyAttribute 的所有属性之间以及两者之间使用相等,这样我就不需要比较器,只需要 T。

可能吗?:)

4

2 回答 2

0
T instance = GetSomeT();
Predicate<T> MyPredicate = x => comparer(x, instance);
TRepository.GetAll().Where(MyPredicate);

考虑到下面给出的评论,这里是你如何制作Expression<Func<T, bool>>

T instance = GetSomeT();
Expression<Func<T, bool>> Exp = x => comparer(x, instance);
TRepository.GetAll().Where(Exp);

这完全一样,只是使用了不同的 var 类型。

简而言之,您可以:

TRepository.GetAll().Where(x => comparer(x, instance));
于 2013-06-06T12:57:26.637 回答
0

假设您可以获得compareras Expression<Func<T, T, bool>>,那么您可以使用LINQKit来执行此操作。

就像是:

Expression<Func<Foo, Foo, bool>> comparer =
    (a, b) => a.IdPart1 == b.IdPart1 && a.IdPart2 == b.IdPart2;

Foo instance = …;

Expression<Func<Foo, bool>> predicate = x => comparer.Invoke(x, instance);
var expandedPredicate = predicate.Expand();

var result = FooRepository.GetAll().Where(expandedPredicate);

Expand()部分很重要,因为这就是 LINQKit 的“魔力”发生的地方。做同样事情的一个稍微不同的语法是AsExpandable()改用:

var result = FooRepository.GetAll().AsExpandable().Where(predicate);
于 2013-06-06T13:10:39.320 回答