2013-07-15 74 views
1

我一直在試圖找到一種方法來使用多個條件與Sql,在我使用實體框架的那一刻。這是實現我想要的唯一途徑的一個很好的機會,但我想知道是否有人知道更有效的方法。Sql多重條件方法

從本質上講,我使用的標準在其中找到要挑數據庫中的下一行。例如允許使用2個以下條件:

1)字段1 = A;

2)Field2 = B;

| RowId | Field1 | Field2 | 

| 0001 |  A  | B | 

| 0002 | B | B | 

| 0003 | C | C | 

| 0004 | A | C | 

我需要單獨挑以下順序每行:

0001 - Both Condtions Satisfied, 

0004 - Condition 1 Satisfied, 

0002 - Condition 2 Satisfied, 

0003 - No conditions satisfied 

目前我做了以下

public TestObj GetNextObj() 
{ 
    using (TestDb testDb = new TestDb()) 
    { 
     TestObj testObj = (from o in testDb.TestTable 
          where o.Field1 == A && o.Field2 == B 
          select o).FirstOrDefault(); 

     if (testObj != null) 
      return testObj; 

     testObj = (from o in testDb.TestTable 
          where o.Field1 == A 
          select o).FirstOrDefault(); 

     if (testObj != null) 
      return testObj; 

     testObj = (from o in testDb.TestTable 
          where o.Field2 == B 
          select o).FirstOrDefault(); 

     if (testObj != null) 
      return testObj; 

     testObj = (from o in testDb.TestTable 
          select o).FirstOrDefault(); 

     return testObj; 
    } 
} 

下表中

所以

這工作正常,但是我想允許條件定義在表中,我擔心,當t他的條件數量增加,這個過程將開始花費很長時間。

有沒有另一種方法來做我在這裏嘗試?

謝謝。

編輯:::::

現在使用下面的代碼來選擇另一個表::

public static SortTest GetRow() 
    { 
     using (TestDb testDb = new TestDb()) 
     { 
      SortParam[] sortParams = (from sp in testDb.SortParams 
             orderby sp.Priority ascending 
             select sp).ToArray(); 

      if (sortParams.Length == 0) 
      { 
       SortTest sortTest = (from st in testDb.SortTests 
            orderby st.RowId ascending 
            select st).FirstOrDefault(); 
       Console.WriteLine("Short route"); 
       return sortTest; 
      } 

      Console.WriteLine("Long route"); 

      StringBuilder sqlQueryBuilder = new StringBuilder(); 

      sqlQueryBuilder.Append("SELECT * FROM [Proto].[dbo].[SortTests] ORDER BY \n"); 

      foreach (SortParam sortParam in sortParams) 
      { 
       sqlQueryBuilder.Append("CASE WHEN " + sortParam.FieldName + " LIKE '%" + sortParam.FieldValue + "%' THEN 1 ELSE 2 END,\n"); 
      } 

      sqlQueryBuilder.Append("\nRowId"); //By default use row Id 
      DbSqlQuery<SortTest> dbSqlQuery = testDb.SortTests.SqlQuery(sqlQueryBuilder.ToString()); 
      return dbSqlQuery.FirstOrDefault(); 
     } 
    } 

我可能要改變thigns,以防止SQL定義,以便從表中的項目注射,但現在這個工作。

謝謝!

回答

3

有沒有在SQL做在單個查詢的簡單方法:

select * 
from o 
order by case Field1 when 'A' then 1 else 2 end, 
     case Field2 when 'B' then 1 else 2 end, 
     RowId 
+0

你的建議是好的!如果數值比'A','B','C'更復雜,那麼也可以使用類似'decode'或編寫一個返回1/2的函數。 – AKDADEVIL

+0

@AKDADEVIL:解碼特定於Oracle - 我認爲OP可能會使用SQLServer,基於他在其他問題上的標籤。 –

+1

你可能是對的。那麼,因爲我已經upvoted你的答案,我不以任何方式感到內疚......;) – AKDADEVIL