1

Entity Frameworkを使用している現在、Sqlで複数の条件を使用する方法を見つけようとしています。これが私が望むものを達成する唯一の方法である可能性は非常に高いですが、誰かがより効率的な方法を知っているかどうか疑問に思いました.

基本的に、基準を使用して、選択する必要があるデータベース内の次の行を見つけています。たとえば、次の 2 つの条件を使用できます。

1) フィールド 1 = A;

2) フィールド 2 = 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;
    }
}

これは問題なく機能しますが、テーブルで条件を定義できるようにしたいのですが、条件の数が増えると、このプロセスに非常に長い時間がかかり始めるのではないかと心配しています。

私がここで試みていることを行う別の方法はありますか??

ありがとう。

編集:::::

次のコードを使用して、別のテーブルで定義されている順序でテーブルから項目を選択します::

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 インジェクションを防ぐために変更する必要があるかもしれませんが、これは今のところ機能します。

ありがとう!

4

1 に答える 1

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
于 2013-07-15T09:13:53.383 に答える