我如何使用Linq表达式使用反射

本文关键字:反射 表达式 Linq 何使用 | 更新日期: 2023-09-27 18:08:31

我目前有一个情况,我正在执行搜索使用Linq到实体。

如果我想通过客户端的参考代码搜索,我将使用这个方法:GetClientByReference("A01")

public IQueryable<DataLayer.Client> GetClientByReference(String reference)
{
    return new DataLayer.DlClient(this.Entities).GetClientByReference(reference);
}

如果我想搜索一个客户的名字,我将使用这个方法:GetClientByName("Joe")

public IQueryable<DataLayer.Client> GetClientByName(String name)
{
    return new DataLayer.DlClient(this.Entities).GetClientByName(name);
}

显然,在可扩展性方面,这是非常糟糕的,因为我需要将方法组合在一起,并为每个可搜索字段编写一个(GetClientByDateAndReferenceAndName ??)有没有办法让这个更通用?

理想情况下,我希望能够做这样的事情:

  • GetClient("Reference", "A01")
  • GetClient("Name", "Joe")
  • GetClient("Reference", "A01", "Name", "Joe")

我如何使用Linq表达式使用反射

我假设您的DataLayer.DlClient(this.Entities)返回IQueryable<Client>:

public IQueryable<DataLayer.Client> GetClientBy(Expression<Func<Client, bool>> filter)
{
    return new DataLayer.DlClient(this.Entities).Where(filter);
}

现在你可以

var clients = GetClientBy(client => client.Name == "Joe");
var clients = GetClientBy(client => client.Reference == "A01");
var clients = GetClientBy(client => client.Reference == "A01" &&  
                                    client.Name == "Joe");