我看到可以将已编译的方法添加到一起。
Expression<Func<Customer, bool>> ln = c => c.lastname.Equals(_customer.lastName, StringComparison.InvariantCultureIgnoreCase);
Expression<Func<Customer, bool>> fn = c => c.firstname.Equals(_customer.firstName, StringComparison.InvariantCultureIgnoreCase);
Expression<Func<Customer, bool>> fdob = c => c.DOB.ToString("yyyyMMdd").Equals(_customer.DOB.ToString("yyyyMMdd"));
var filter = ln.Compile() + fn.Compile() + fdob.Compile();
这样做有意义吗?
我打算使用过滤器代替 lambda 表达式来过滤客户存储库:
IEnumerable<Customer> customersFound = _repo.Customers.Where(filter);
根据业务逻辑,我可能会也可能不会将这三个编译方法一起添加,但是我会挑选并可能添加更多编译方法。
谁能解释一下将它们加在一起是否会构成一个查询字符串?谁有更好的建议?
我可以链接“Where”语句并使用常规的 lambda 表达式,但我很想知道您可以从编译方法并将它们相加中获得什么!
最佳答案
这是 Compile 的副作用方法返回一个委托(delegate)。
在内部,委托(delegate)是一个多播委托(delegate),它可以涉及对方法的多个链接引用。
在这种情况下,+
只是一种将它们链接在一起的快速方法。您可以在 How to: Combine Delegates 中阅读更多关于合并代表的信息。在 MSDN 上。
这是一个 LINQPad演示的程序:
void Main()
{
var filter = GetX() + GetY() + GetZ();
filter().Dump();
}
public int X() { Debug.WriteLine("X()"); return 1; }
public int Y() { Debug.WriteLine("Y()"); return 2; }
public int Z() { Debug.WriteLine("Z()"); return 3; }
public Func<int> GetX() { return X; }
public Func<int> GetY() { return Y; }
public Func<int> GetZ() { return Z; }
输出:
X()
Y()
Z()
3
请注意,它因此似乎只是忽略了第一个方法调用的返回值,而只返回最后一个方法,尽管它也完全调用了先前的方法。
请注意,上面的代码与此类似:
void Main()
{
Func<int> x = X;
Func<int> y = Y;
Func<int> z = Z;
var filter = x + y + z;
filter().Dump();
}
public int X() { Debug.WriteLine("X()"); return 1; }
public int Y() { Debug.WriteLine("Y()"); return 2; }
public int Z() { Debug.WriteLine("Z()"); return 3; }
因此,简短的回答是,不,这不会执行您希望它执行的操作。
关于c# - 将已编译的 Func 方法添加在一起的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15721993/