减少用于筛选的linq查询

本文关键字:linq 查询 筛选 用于 | 更新日期: 2023-09-27 17:59:14

我有一个视图,其中有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();
    }

与其编写多个查询,不如用一个查询或任何优化的方式来实现这一点?

减少用于筛选的linq查询

使用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;