2013-07-15 89 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