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定義,以便從表中的項目注射,但現在這個工作。
謝謝!
你的建議是好的!如果數值比'A','B','C'更復雜,那麼也可以使用類似'decode'或編寫一個返回1/2的函數。 – AKDADEVIL
@AKDADEVIL:解碼特定於Oracle - 我認爲OP可能會使用SQLServer,基於他在其他問題上的標籤。 –
你可能是對的。那麼,因爲我已經upvoted你的答案,我不以任何方式感到內疚......;) – AKDADEVIL