c# - 将已编译的 Func 方法添加在一起的目的是什么?

标签 c# linq lambda compiled

我看到可以将已编译的方法添加到一起。

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/

相关文章:

c# - 如何获取特定页面类型构建器类型的 EPiServer 页面,并正确填充其所有强类型属性?

java - 是否有类似于 Integer::sum 的乘法?

C# => 运算符?

java - 如何在 Java 中映射 lambda 表达式

c# - 使用 Linq C# Asp.net 显示来自不同表的数据

c# - SQL 连接最佳实践

c# - Entity Framework 不将数据保存到 WPF 中的数据库

c# - Linq to nhibernate - 其中集合包含具有 id 的对象

c# - 使用 SMO 或 Linq 的 SQL Server CLR 触发器?

c++ - 是否有用于 C++ 的 LINQ 库?