2009-01-12 108 views
1

我在用c#编写linq到sql数据查询表达式的查询时遇到问题。linq to sql case查询

我试图最终做的是基于这个伪代码表达式。

public IQueryable<CTest> searchRecords(string category, string searchString, DateTime startDate, DateTime endDate, int searchType, int searchType2) 
     { 
      //-Search All Records 
      //-From the information table 
      //-By the category column containing a specific search 
      //-Also by 
      // ~if both a startDate and endDate are entered (not (0000,00,00) OR null) then get records 
      // by this expression 
      // ~else then don't worry about this statement 
      //-Also by 
      // ~if a searchType is equal zero(0) then search for records from the 
      // search_type table equal to zero(0) 
      // ~if a searchType is equal one(1) then search for records from the 
      // search_type table equal to one(1) 
      // ~else then don't worry about this statement 
      //-Also by 
      // ~if a searchType2 is equal zero(0) then search for records from the 
      // search_type table equal to zero(0) 
      // ~if a searchType2 is equal one(1) then search for records from the 
      // search_type table equal to one(1) 
      // ~else then don't worry about this statement 

      //Here is my attempt at it 
      /* 
       var table = db.table1; 

       switch (category) 
       { 
       case "_category1": 
        var records = 
         from c in table 
         where c.column1.ToString().Contains(searchString) 
         select new CTest 
         { 
          test_id = c.id, 
          test_name = c.name, 
          test_number = c.number, 
          date = ((startDate != null) && (endDate != null)) ? ((c.test_date >= startDate) && (c.test_date <= endDate)) : 
             c.test_date), 
          test_type = (searchType == 0 ? (c.searchType = 0) : 
             searchType == 1 ? (c.searchType = 1) : 
             c.searchType), 
          test_type2 = (searchType2 == 0 ? (c.searchType2 = 0) : 
             searchType2 == 1 ? (c.searchType2 = 1) : 
             c.searchType2) 
         }; 
        break; 
       default: 
        break; 
       } 
      */ 
     } 

在此先感谢。

+0

[linq case statement]的可能重复(http://stackoverflow.com/questions/936028/linq-case-statement) – 2014-10-10 18:20:07

回答

3

这将是更容易的扩展方法比LINQ语法做:

var records = context.Table 
         .Where(c => c.column1.Contains(searchString)); 
if (startDate != null && endDate != null) 
{ 
    records = records.Where(c => c.test_date >= startDate 
            && c.test_date <= endDate); 
} 

... 

这将建立的LINQ表达式,当您去。评估被延迟,直到您实际调用一些需要执行选择的扩展(如Count()或ToList())或枚举结果的元素。