2015-01-15 124 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