Как сформировать выделенные строки с помощью составного ключа в ODP.NET?

Имея список составных ключей, как можно кодировать команду ODP.NET, которая выбирает все строки с помощью составных ключей?

select * from table t
where (t.A, t.B, t.C) in (
  ('key1A','key1B', 1),
  ('key2A','key2B', 2),
  ('key3A','key3B', 3)
)

У меня есть следующий пример кода:

class TableKey 
{
    public string ColumnA {get;set;}
    public string ColumnB {get;set;}
    public long ColumnC {get;set;}
}

List<TableKey> listOfKeys = GetListOfKeys();

// should translate to:
// select * from table t
// where (t.A, t.B, t.C) in (
//   ('key1A','key1B', 1),
//   ('key2A','key2B', 2),
//   ('key3A','key3B', 3)
// )
var query = "select * from table t where (t.A, t.B, t.C) in (:keys)";

using (var con = new OracleConnection(_connectionString))
using (OracleCommand cmd = con.CreateCommand())
{
    cmd.CommandText = query;
    cmd.BindByName = true;
    cmd.ArrayBindCount = listOfKeys.Count;

    // How should the parameters be populated?
    // cmd.Parameters.Add("keys", OracleDbType.???).Value = listOfKeys.ToArray();

    await con.OpenAsync().ConfigureAwait(false);
    using (DbDataReader reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false))
    {
        var result = new List<TableObject>();
        while (await reader.ReadAsync().ConfigureAwait(false))
        {
            // create object from reader and add it to the list
        }
        return result;
    }
}

Я видел этот ТАК вопрос, который, я думаю, иллюстрирует то, что я хотел бы сделать в odp.net

Я также попробовал следующее, но он всегда возвращает и исключение оракула конца файла:

var query = "select * from table t where t.A = :keyA and t.B = :keyB and t.C = :keyC"

for(var i = 0; i < listOfKeys.Count; i++)
{
    arrayKeyA[i] = listOfKeys[i].ColumnA;
    arrayKeyB[i] = listOfKeys[i].ColumnB;
    arrayKeyC[i] = listOfKeys[i].ColumnC;
}

cmd.Parameters.Add("keyA", OracleDbType.Varchar2).Value = arrayKeyA;
cmd.Parameters.Add("keyB", OracleDbType.Varchar2).Value = arrayKeyB;
cmd.Parameters.Add("keyC", OracleDbType.Decimal).Value = arrayKeyC;

0 ответов

Другие вопросы по тегам