【问题标题】:How can I use a Linq expression using reflection?如何使用反射使用 Linq 表达式?
【发布时间】:2013-04-10 11:51:28
【问题描述】:

我目前正在使用 Linq to Entities 执行搜索。

如果我想通过客户的参考代码搜索,我会使用这种方法: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")

【问题讨论】:

  • 你是怎么解决的?您是否使用了Expression&lt;Func&lt;Client, bool&gt;&gt; 或者建议的Func&lt;Client, bool&gt; 是否也可以在内部返回所有客户端而不是请求的客户端?
  • 我使用“原样”的答案,使用Func&lt;Client, bool&gt; filter

标签: c# asp.net .net linq entity-framework


【解决方案1】:

我假设你的DataLayer.DlClient(this.Entities) 返回IQueryable&lt;Client&gt;

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");

【讨论】:

  • 问题:在 LinqToSql 中,我会将Func&lt;Client, bool&gt; 更改为Expression&lt;Func&lt;Client, bool&gt;&gt;,因为第一个会导致对所有客户端的查询并将其过滤到内存中,而第二个会很好地转换为 sql。你的情况不是这样吗?
  • 这很好 :) 并且经过一些修改,我设法使其适应我的用例。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多