C# 如何在lambda表达式中放置内联条件并集/自联接?
如果参数从表e.q中的同一字段调用了两个不同类型的to值,我如何使用lambda编写和行union/join语句C# 如何在lambda表达式中放置内联条件并集/自联接?,c#,linq,asp.net-mvc-4,lambda,C#,Linq,Asp.net Mvc 4,Lambda,如果参数从表e.q中的同一字段调用了两个不同类型的to值,我如何使用lambda编写和行union/join语句 Etype ------- class A class B class C 我将根据MVC4中作为QS/参数的表单中的用户选择附加查询 public ActionResult Home(string title, string EtypeA) { EtypeA = (Convert.ToBoolean(EtypeA)) ? "typeA" : null;
Etype
-------
class A
class B
class C
我将根据MVC4中作为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();
或者,无需链接,您也可以制作更大的单衬里:
var results = db.EList.Where(p =>
(title == null || p.Title.Contains(title)) &&
(typesToFilter.Count == 0 || typesToFilter.Contains(p.EType)));
不清楚您的EList项目是什么样子的。它们是否有单独的属性EtypeA==typeA,EtypeB==typeB。。。LINQ示例暗示了这一点,或者您有一个可以保存不同值的属性吗?@Groo:有一个字段Etype,它有3种类型的值typeA,typeB和typeC,并希望&&如果查询来筛选Etype为A和B的所有记录。我已经编辑了原始问题,请查看它现在是否有意义。如果您不介意,我还有一个问题,如果I.Etype还包含多个项,例如,在本列中记录的类别A和类别B。如何组合多个项?用逗号?即A型,B型?此外,这是否意味着仅当A和B一起检查时,或者即使仅检查其中一个,才应返回此项?正如我在第一段代码中所写的,如果EType可以包含多个项,那么可以使用typesToFilter.Anyp.EType.Contains来查找p.EType是否包含typesToFilter中的任何字符串,甚至是部分字符串。是的,如果A或B与typesToFilter中的比较项匹配,则应返回逗号。我不确定EType的类型,但我想是一根绳子吧?很可能编译器无法正确推断类型。如果将其写成typesToFilter.Anyt=>i.EType.Containst,会发生什么?
var results = db.EList.Where(p =>
(title == null || p.Title.Contains(title)) &&
(typesToFilter.Count == 0 || typesToFilter.Contains(p.EType)));