2013-07-15 3 views
1

저는 Sity에서 여러 조건을 사용하는 방법을 찾으려고했습니다. 현재 Entity Framework를 사용하고 있습니다. 이것이 내가 원하는 것을 성취 할 수있는 유일한 방법이라는 아주 좋은 기회가 있습니다.하지만 누군가가 더 효율적인 방법을 알고 있는지 궁금해했습니다.Sql 다중 조건 메서드

필자는 데이터베이스에서 선택해야하는 다음 행을 찾기 위해 기준을 사용하고 있습니다. 예를 들어 다음 두 가지 조건을 사용할 수 있습니다.

1) Field1 = A;

2) Field2 = B; 순간

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; 
    } 
} 
을하고있는 중이 야 : 나는 다음과 같은 순서로 개별적으로 각 행을 선택해야

| RowId | Field1 | Field2 | 

| 0001 |  A  | B | 

| 0002 | B | B | 

| 0003 | C | C | 

| 0004 | A | C | 

: 다음 표에 따라서

이것은 괜찮습니다. 그러나 조건을 테이블에 정의 할 수있게하고 싶습니다. 그는이 과정이 매우 오랜 시간이 걸리기 시작할 조건이 증가합니다.

여기에서 시도하는 다른 방법이 있습니까?

감사합니다.

편집 :::::

이제 다른 테이블 ::

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(); 
     } 
    } 

내가 SQL을 방지하기 위해 thigns을 변경해야 할 수도 있습니다에 의해 정의 된 순서대로 테이블에서 항목을 선택하려면 다음 코드를 사용하여 주사하지만 지금은 효과가 있습니다.

고맙습니다!

답변

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

귀하의 제안 괜찮이! 하나는 또한, 'C' – AKDADEVIL

+0

@AKDADEVIL '디코드'같은 것을 사용하거나 값이 단지 'A'보다 더 복잡한 경우 1/2을 반환 기능, 'B'를 작성할 수 디코드 오라클에 고유 - 나는 생각 OP는 다른 질문에 대한 태그를 기반으로 SQLServer를 사용하고있을 수 있습니다. –

+1

아마도 맞을 것입니다. 글쎄, 나는 이미 당신의 대답을 어떤 식 으로든 죄책감을 느끼지 않고있다 upvoted ...;) – AKDADEVIL