如何在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))
提前感谢您抽出时间。
如果这是(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)));