2014-09-12 67 views
0

我如何可以編寫和使用lambda如果參數要求從表中同一領域2個不同類型的值,EQ如何在lambda表達式中添加內聯條件聯合/自聯接?

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

我基於從形式向用戶選擇追加查詢行工會/連接語句

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))) 
     ... 
} 

事情(如MVC 4 QS /參數推出)都不錯,到目前爲止,但形式有複選框ETYPE過濾,所以如果用戶想看到ETYPE A和ETYPE B得,他會選擇這兩個複選框和參數將作爲

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

現在我該如何編寫內聯查詢來加入這兩種類型的E(員工)。 由於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)) 

預先感謝您的時間。

+0

目前還不清楚你的'EList'項目是怎樣的。他們是否有單獨的屬性('EtypeA ==「typeA」','EtypeB ==「typeB」',...),你LINQ示例暗示,還是你有一個單獨的屬性可以保存不同的值? – Groo 2014-09-12 10:46:20

+0

@Groo:有一個字段Etype,它有3種類型的值(typeA,typeB和typeC),並且想要&&如果查詢來過濾Etype爲A和B的所有記錄。 – Vishal 2014-09-12 10:49:47

回答

0

如果這是LINQ到SQL(的EF),你有一個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」,「類型B」或「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))); 
+0

我編輯了原始問題請看看它現在是否有意義。 – Vishal 2014-09-12 11:32:28

+0

@Vishal:這不工作嗎? – Groo 2014-09-12 11:40:50

+0

最後的代碼塊工作:)非常感謝Groo。 – Vishal 2014-09-12 11:51:09