1

linqまたはORMなしで遅延読み込みを実行できるかどうかを知りたいだけです。ORMには不適切なクエリがいくつかあります。また、メソッド間でクエリを渡す必要があります。また、これを達成するためのマイクロオームを見つけることができませんでした。これを行う方法はありますか?

var q = "Select Name from Test1"

ここで、OR、AND、IN、またはその他のものを追加する必要があります

このクエリは、フィルタリングされるさまざまなメソッドに渡されます。マイクロORMまたはアドホックSQLクエリを使用してこれを行う方法はありますか?

4

6 に答える 6

7

データリーダーを直接使用することも、遅延評価するクラスを介して実行することもできます。http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.100).aspxを参照してください

大まかな例として、あなたはこのようなことをするかもしれません

public class LazyReader {
    SqlDataReader m_reader;
    SqlCommand m_command;
    SqlConnection m_connection;
    public LazyReader(SqlConnection connection, String sql)
    {
        m_command = new SqlCommand(sql, connection);
        m_connection = connection;
    }

    public IEnumerable<Object[]> read()
    {
        using (m_connection) {
            m_connection.Open();
            m_reader = command.ExecuteReader();
            while (m_reader.HasRows)
            {
                while (m_reader.Read())
                {
                    Object[] values = new Object[m_reader.FieldCount];
                    m_reader.GetValues(values);
                    yield return values;
                }
                m_reader.NextResult();
            }
            m_reader.Close();
        }
    }
}

例をいじる必要があるかもしれませんが、アイデアは、DataReaderを使用して行を1つずつ読み取り、結果をIEnumerableに渡して結果を渡すことです。これにより、遅延評価が発生します。次に、IEnumerableを渡して、好きなように読むことができます。一貫して読み取るように注意してください。そうしないと、SQLConnectionは30秒後にアクティビティなしで終了します。

于 2012-07-09T11:35:24.333 に答える
6

Funcまたはを使用してクエリを定義してもらうのはなぜですかAction。次の関数に渡すときに、必要なときに実行できます。

遅延読み込みのように機能します。

于 2012-05-23T01:27:12.523 に答える
5

使用できます

レイジー < T >

このため。James が示唆するように Func に依存していますが、キャッシングとスレッド セーフもサポートしています。

http://msdn.microsoft.com/en-us/magazine/ff898407.aspx

編集: フィルタリングやソートなどの ORM の追加機能を探していますが、生の SQL を柔軟に記述できるので、Entity Framework や Nhibernate などの ORM を調べて、生の SQL 機能のいくつかを使用することをお勧めします。必要に応じて

session.CreateSQLQuery(sql);

ORM を使用すると、入力を強化して、where フィルターを動的に追加する際のミスをなくすこともできます。

于 2012-07-11T08:52:21.070 に答える
1

1 つの方法は、さらに式を追加できる何らかのメモリ内オブジェクトとしてクエリを表現することです。たとえば、構成されたオブジェクト階層を使用すると、次のようになります。

var q = Table("Test1").Select("Name");

フィルターを追加して、これをさらに絞り込みます。

q = q.Where("ID= 1");

しかしもちろん、これはあなたが再発明していることを意味しますIQueryable。その場合は、LINQ を採用し、プロバイダー (LINQ2SQL または LINQ2EF など) を選択することをお勧めします。

もう 1 つの方法は、文字列のアドホック表現を維持することです。

var q = "Select Name from Test1";

しかし、その後、どのようにフィルターを追加しますか? 文字列を解析し、WHERE 句を挿入する必要があります。これは些細なことではありません。すぐに本格的な SQL パーサー ( l​​ex + yaccまたはbison + flex ) と抽象構文ツリーを実装し、これを新しい SQL 文字列としてシリアル化します。結合 (サポートするのはかなり些細なこと)、サブクエリ (厄介)、再帰テーブル式 (痛い) について考え始めると、物事は次第に複雑になります。このサイトを参照して、SQL クエリがどのように複雑になるかを見て、その解析を実装することを想像してみてください。

私が見たプロジェクトの多くは、クエリを何らかの中間形式として表現しようとしました。構造 (フィールドのリスト、テーブル名、WHERE 条件のリスト、ORDER BY 句のリストなど) を作成し、これらのリスト表現に新しいエントリを追加します (新しいフィルタを追加するには、WHERE リストに新しいエントリを追加します)。しかし、振り返ってみると、これらの表現は LINQ が提供するものと比べると見劣りします。確かに、LINQ は全か無かのオファリングであり、コミットするかしないかのどちらかです。しかし、それを再発明しようとしても、問題の複雑さが明らかになるだけです。今日、私は反対側から問題に取り組みます: LINQ から始めて、それを寄せ付けないようにします。プロジェクトのすべてのレイヤーがフィルターを追加する制御不能なクエリ生成ツールの恐ろしいモンスターに成長させないでください。IQueryableそして、オプティマイザーが解きほぐすことさえできない何かでサーバーを爆撃します。

PS。私が書いた理由 ARELは、この問題全体についての良い読み物です。

于 2012-07-24T10:07:10.727 に答える
1

Lazy<T>クラスはあなたが探しているもののように聞こえます。Kaido と James が示唆するように、実際の読み込みを実行するメソッドを定義し、それを遅延読み込みされた (実際には初期化された) オブジェクトの ctor に渡す必要があります。

元:

public class SomeClass
{
     Lazy<List<string>> myLazy = new Lazy<List<string>>(LoadData);
     private List<string> LoadData()
     {
        //open connection, execute your query, read/project data into a List, etc

        return new List<string> { "Hello", "My", "Name", "Is", "Earl" };
     }
}

このLazy<T>クラスは、期待どおりに動作しValueます。プロパティを介して参照されるまで、含まれているオブジェクトの初期化を延期します。詳細については、MDSN リファレンスを参照してください

于 2012-07-12T16:02:57.750 に答える
1

設計でリポジトリ パターンを検討することをお勧めします。リポジトリは、クライアント クラスに提供する方法を決定します。それがどのように行われるかは消費者にとって重要ではなく、必要な場所に渡したり注入したりできます.

RedisMemcachedなどのオブジェクト キャッシュも検討してください。これらは、オブジェクトを非連続的に「遅延読み込み」する必要がある場合に特に便利です。複雑な SQL クエリを作成して、多数の大きなデータ フィールドではなく主キーのみを返すことができます。クエリのすべてのキーを保存し、必要に応じてビジネス オブジェクトを作成します。

実装が大きくなった場合でも、Repository を使用すると、それを使用するクラスに影響を与えずに簡単に改善できます。

于 2012-07-13T02:27:16.157 に答える