Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在lambda表达式中放置内联条件并集/自联接?_C#_Linq_Asp.net Mvc 4_Lambda - Fatal编程技术网

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

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;

如果参数从表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;
      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)));