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