2015-01-15 180 views
0

是否有一種方法來包含一個CASE或條件語句內的LINQ查詢?我試圖根據傳入該方法的參數動態構建我的select語句。Linq查詢中的CASE或IF語句?

這裏是我如何寫T中的SQL:

select * from Table1 
where Table1Id = 
     CASE WHEN LEN myParameter > 0 
     THEN myParamter 
     ELSE Table1.Table1Id 

,這裏是我的LINQ查詢與SQL CASE中猛:

var query = from a in Table1 
       where a.Table1Id== 
        CASE WHEN LEN myParameter > 0 
        THEN myParamter 
        ELSE Table1.Table1Id 
          && a.shortName == myParameter2 
          && a.Country == myParameter3 
          select a; 

       return query.ToList(); 

這樣的事情......

看起來我可以使用myParameter.Length()方法,但不知道從哪裏開始的語法?

好吧,這裏有雲,整個原始SQL語句的方法:

string nativeSQLQuery = string.Format("SELECT c.ArticleId , 
               + "c.ArticleTitle," 
               + c.Version, 
               + "c.shortName,c.Country,c.ArticleHeader,c.ArticleBody," 
               + "c.DateCreated,c.UserCreated,c.DateUpdated,c.UserUpdated," 
               + "c.isPublished" 
               + "c.isBreakingNews" 
              + " FROM ISES.vwArticles c " 
              + " WHERE c.ArticleTitle = " 
              + "  CASE WHEN LEN('{1}') > 0" 
              + "  THEN '{1}'" 
              + "  ELSE c.ArticleTitle" 
              + "  END " 
              + " AND c.shortName = " 
              + "  CASE WHEN LEN('{2}') > 0" 
              + "  THEN '{2}'" 
              + "  ELSE c.shortName" 
              + "  END " 
              + " AND c.Country = " 
              + "  CASE WHEN LEN('{3}') > 0" 
              + "  THEN '{3}'" 
              + "  ELSE c.Country" 
              + "  END " 
              + " AND c.articleid NOT IN " 
              + " (SELECT pa.articleid FROM ISES.tbPublicationArticles pa " 
              + " WHERE pa.publicationid={0})", publicationId, ModelSelectedArticleTitle, vRegionShortName, ModelSelectedCountryshortName); 
+0

你們是不是要遷移與「可選」的參數,以LINQ的存儲過程?你不必像@詹姆斯表演那樣做。你可以追加'Where()'子句到你的'Queryable <>'和LINQ to Entities將創建適當的SQL語句 – 2015-01-15 16:22:23

回答

-1

使用條件運算符:

var query = from item in table 
    let table1Id = myParameter.Length() > 0 ? myParameter : item.Table1Id 
    select item; 
+0

我懷疑這會在Linq to Entities工作 – 2015-01-15 16:11:31

+0

@PanagiotisKanavos鑑於它有1:1的映射條件操作符到'CASE'語句,我當然期望它能夠工作。英孚當然可能不打算支持它。 – Servy 2015-01-15 16:12:20

+0

這裏所有的'let'都決定了'table1Id'將被設置爲什麼,'where'過濾器仍然丟失。 – James 2015-01-15 16:18:48

3

有條件的過濾不必是查詢本身的一部分, LINQ語句使用延遲加載,因此您可以構建動態查詢

var query = someList; 
if (myParameter > 0) { 
    // dynamic filter 
    query = query.Where(x => x.Table1Id == myParameter); 
} 

Alt eratively寫成一個班輪

var query = myParameter > 0 ? someList : someList.Where(x => x.Table1Id == myParameter); 

現有代碼重新編寫

var query = _Context.vwArticles 
    .Where(x => a.ArticleTitle == modelSelectedArticleTitle && 
       a.shortName == regionShortName && 
       a.Country == modelSelectedCountryshortName); 
if (myParameter > 0) { 
    query = query.Where(x => x.Table1Id == myParameter); 
} 
return query.ToList(); 
+0

這隻有在條件在整個查詢期間保持不變的情況下才有可能,並且在執行查詢之前知道。例如,如果它依賴於該行中的數據,那麼這是不可能的。 – Servy 2015-01-15 16:11:16

+0

@Servy在上面的例子中,會出現*的情況。 – James 2015-01-15 16:11:57

+0

@Servy我不認爲你可以用LINQ表達一個'SELECT CASE'。這絕對是另一種ORM不應該用作SQL替換的情況。具有所需查詢的視圖將更易於閱讀和維護 – 2015-01-15 16:13:53