减少用于过滤的 linq 查询

Posted

技术标签:

【中文标题】减少用于过滤的 linq 查询【英文标题】:Reduce linq query for filtering 【发布时间】:2014-06-05 11:12:32 【问题描述】:

我有一个视图,其中包含 3 个文本框,它们绑定到 ViewModel SupplierNameContactAddress 中的属性和一个绑定到我的 ViewModel 中 SearchCommand 属性的按钮。

我的要求是根据上述属性过滤Supplier 记录。我使用了 EntityFramework。

用户可以输入任何上述文本框,这会导致我编写 9 个不同的查询。 例如,如果用户仅在 SupplierName 文本框上输入数据,那么我需要以 SupplierName 作为参数运行一个查询。如果用户输入 SupplierNameContact 文本框,那么我需要运行另一个查询。以此类推。

这是我的代码:

public IEnumerable<Model.Supplier> GetAllSuppliersBySearch(string nameMatch, string contactMatch, string phoneMatch)
    

        if(nameMatch!=null)
        
             var q = from f in Context.Suppliers
                where f.SupplierName==nameMatch 
                select f;
        
        else if(contactMatch!=null)
        
             var q = from f in Context.Suppliers
                where  f.ContactName==contactMatch 
                select f;
        
        else if(phoneMatch!=null)
        
            var q = from f in Context.Suppliers
                where  f.ContactName==contactMatch 
                select f;
        

        return q.AsEnumerable();
    

如何用一个查询或以任何优化的方式来完成此任务,而不是编写多个查询?

【问题讨论】:

【参考方案1】:

使用 lambda 语法编写查询:

IQueryable<Supplier> query = Context.Suppliers;

if (!String.IsNullOrEmpty(nameMatch))
   query = query.Where(s => s.SupplierName == nameMatch);

if (!String.IsNullOrEmpty(contactMatch))
   query = query.Where(s => s.ContactName == contactMatch);

// etc

return query.AsEnumerable();

另一种选择是在查询中添加参数检查条件

var query = 
   from s in Context.Suppliers
   where (String.IsNullOrEmpty(nameMatch) || s.SupplierName == nameMatch) &&
         (String.IsNullOrEmpty(contactMatch) || s.ContactName == contactMatch)
         // etc
   select s;

【讨论】:

以上是关于减少用于过滤的 linq 查询的主要内容,如果未能解决你的问题,请参考以下文章

在 linq 查询中按条件过滤

csharp 具有多个过滤器和连接的Linq查询

具有复杂过滤 LINQ to XML c# 的查询

C#基础:LINQ 查询函数整理

linq中分组查询而且获取每个分组中的第一条记录,数据用于分页绑定

具有 Lightswitch 计算属性的 Linq to SQL 查询过滤器