Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sql多条件方法_C#_Sql_Entity Framework_Query Optimization - Fatal编程技术网

C# Sql多条件方法

C# Sql多条件方法,c#,sql,entity-framework,query-optimization,C#,Sql,Entity Framework,Query Optimization,我一直在试图找到一种在Sql中使用多个条件的方法,目前我正在使用实体框架。有一个非常好的机会,这是实现我想要的唯一途径,但我想知道是否有人知道一个更有效的方法 基本上,我使用标准来查找数据库中应该选择的下一行。例如,让我们使用以下两个条件: 1) 字段1=A 2) 字段2=B 因此,在下表中: | RowId | Field1 | Field2 | | 0001 | A | B | | 0002 | B | B | | 0003 | C | C | | 0004

我一直在试图找到一种在Sql中使用多个条件的方法,目前我正在使用实体框架。有一个非常好的机会,这是实现我想要的唯一途径,但我想知道是否有人知道一个更有效的方法

基本上,我使用标准来查找数据库中应该选择的下一行。例如,让我们使用以下两个条件:

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();
        }
    }
publicstaticsorttest GetRow()
{
使用(TestDb TestDb=newtestdb())
{
SortParam[]sortParams=(来自testDb.sortParams中的sp
orderby sp.优先级递增
选择sp.ToArray();
if(sortparms.Length==0)
{
SortTest SortTest=(来自testDb.SortTests中的st)
orderby st.RowId升序
选择st).FirstOrDefault();
控制台写入线(“短路线”);
返回排序测试;
}
控制台。写线(“长路线”);
StringBuilder sqlQueryBuilder=新StringBuilder();
Append(“从[Proto].[dbo].[SortTests]ORDER BY\n中选择*”;
foreach(排序图中的排序图)
{
sqlQueryBuilder.Append(“当“+sortParam.FieldName+”类似“%”“+sortParam.FieldValue+”%”时的大小写,然后是1或2结束,\n”);
}
sqlQueryBuilder.Append(“\nRowId”);//默认情况下使用行Id
DbSqlQuery DbSqlQuery=testDb.SortTests.SqlQuery(sqlQueryBuilder.ToString());
返回dbSqlQuery.FirstOrDefault();
}
}
我可能不得不修改一些东西来防止Sql注入,但现在可以了


谢谢

在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

你的建议很好!如果值比“a”、“B”、“C”更复杂,你也可以使用“decode”或编写一个返回1/2的函数@AKDADEVIL:decode是Oracle特有的-我认为OP可能在使用SQLServer,基于他在其他问题上的标记。你可能是对的。好吧,既然我已经对你的答案投了赞成票,我一点也不感到内疚……;)谢谢,这确实很有效。有没有这样的用法:…CASE Field1像'A%'然后1 ELSE 2 END…抱歉,我刚刚知道我现在用的是:…CASE WHEN Field1像'A%'然后1 ELSE 2 END。。。