如何在lambda表达式中放置内联条件并集/自联接

本文关键字:条件 lambda 表达式 | 更新日期: 2023-09-27 18:21:42

如果参数从表中的同一字段调用2个不同类型的值,我如何使用lambda编写并执行联合/联接语句,e.q

 Etype
-------
 class A
 class B
 class C

我正在根据用户从表单中的选择添加查询(在mvc 4中作为QS/参数)

public ActionResult Home(string title, string EtypeA)
{
      EtypeA =  (Convert.ToBoolean(EtypeA)) ? "typeA" : null;
      var results = db.EList.Where(p => (title ==null || p.Title.Contains(title)) && 
                                        (EtypeA ==null || p.EtypeA.Contains(EtypeA)))
      ...
}

到目前为止,情况还不错,但表单中有Etype过滤的复选框,所以如果用户想查看Etype A和Etype B的结果,他会选择这两个复选框,参数将以形式出现

public ActionResult Home(string title, string EtypeA, string EtypeB)

现在,我如何编写内联查询来联接这两种类型的E(employee)。由于EtypeA和EtypeB指的是Etype字段中的值,我试图找到它们,比如:

 public ActionResult Home(string title, string EtypeA, string EtypeB)
    {
          EtypeA =  (Convert.ToBoolean(EtypeA)) ? "typeA" : null;
          EtypeB =  (Convert.ToBoolean(EtypeB)) ? "typeB" : null;
var results = db.PartnersList.Where(p => (title ==null || p.Title.Trim().ToLower().Contains(title.ToLower())) &&
                                            ((EtypeA == null || p.EType.Contains(EtypeA) || (EtypeB == null || p.EType.Contains(EtypeB)) 

提前感谢您抽出时间。

如何在lambda表达式中放置内联条件并集/自联接

如果这是(EF的)LINQ to SQL,并且您有一个IQueryable,那么链接多个Where方法应该会导致发出相同的SQL:

// not sure what EList is though
var items = db.EList.AsQueryable(); // or `IEnumerable<T>` ?
if (title != null)
    items = items.Where(i => i.Title.Contains(title));
var typesToFilter = new List<string>();
if (Convert.ToBoolean(EtypeA))
    typesToFilter.Add("typeA");
if (Convert.ToBoolean(EtypeB))
    typesToFilter.Add("typeB");
if (typesToFilter.Count > 0)
    items = items.Where(i => typesToFilter.Any(i.EType.Contains));
// this is where the provider will actually traverse the 
// expression tree, convert it to SQL and execute it:    
var results = items.ToList();

此外,如果EType总是包含"typeA"、"typeB"或"typeC"中的一个值,则不必使用String.Contains,而是使用List.Contains(它将发出更高效的SQL):

if (typesToFilter.Count > 0)
    items = items.Where(i => typesToFilter.Contains(i.EType));

或者,在没有链接的情况下,你可以做一个更大的一行:

var results = db.EList.Where(p => 
    (title == null || p.Title.Contains(title)) && 
    (typesToFilter.Count == 0 || typesToFilter.Contains(p.EType)));