1

TL;DR私は with を使用EntityFramework 5.0してOracleおり、2 つの列のインデックスのみを使用して 2 つの列のテーブルをクエリする必要がありNVLます。

詳細は何時間もの試行錯誤の末... できる限り整理してみます。

必要な SQL クエリは次のとおりです。

SELECT t.Code, NVL(t.Local, t.Global) Description
FROM   Shows t
Where  t.Code = 123

それで、問題は何ですか?使用したい場合は、row( )Context.Shows.Parts.SqlQuery(query)全体を返す必要がありますが、 Table Access Fullを取得するため、目的の列のみを返す必要があります。*

私が試した次のこと(実際には、次の前に多くの試行がありました...)は、null合体演算子??)を使用していました。

Context.Shows.Where(x => x.Code == 123)
             .Select(x => new { x.Code, Description = x.Local ?? x.Global);

しかし、それが使用している SQL は複雑であり、重要なcase & whenインデックスを使用して使用していません Code, Nvl(Local, Global)!

私の次のステップはDatabase.SqlQueryを使用することでした

context.Database.SqlQuery<Tuple<int, string>>("the Raw-SQLQuery above");

しかし、Tuple抽象的であってはならず、デフォルトのctorが必要なエラーが発生します(そうではありません)。

私が嫌いな最後のステップは、これら2つのプロパティ( )のみを持つクラスを作成することCode, Descriptionです...これはうまく機能しますが、そのようなクエリごとにクラスを作成したくありません。

アイデア?

4

1 に答える 1

2

これは解決策のない答えです。

どう頑張っても無理だと思います。独自の変更可能なジェネリック タプルを定義しても、プロパティの名前が列の名前と一致する必要があるため、失敗します。

SqlQuery(String, Object[]): 指定されたジェネリック型の要素を返す生の SQL クエリを作成します。この型は、クエリから返される列の名前と一致するプロパティを持つ任意の型にすることも、単純なプリミティブ型にすることもできます。

Commandできる最善のことは、クラシックとExecuteReaderパターンを介してデータベースにクエリを実行するための独自の汎用メソッドを作成することだと思います。テストされていませんが、アイデアはわかります:

public static IEnumerable<Tuple<T>> SqlQuery<T>(this DbContext context, string sql)
{
    using(var connection = new SqlConnection(context.Database.Connection.ConnectionString))
    using (var command = new SqlCommand(sql, connection))
    {
        var reader = command.ExecuteReader();
        while (reader.NextResult())
        {
            yield return new Tuple<T>((T)reader[0]);
        }
    }
}
public static IEnumerable<Tuple<T1, T2>> SqlQuery<T1, T2>(this DbContext context, string sql)
{
    using (var connection = new SqlConnection(context.Database.Connection.ConnectionString))
    using (var command = new SqlCommand(sql, connection))
    {
        var reader = command.ExecuteReader();
        while (reader.NextResult())
        {
            yield return new Tuple<T1, T2>((T1)reader[0], (T2)reader[1]);
        }
    }
}
于 2013-04-25T10:06:21.867 に答える