如何使用ad hoc sql查询进行延迟加载:SQL过滤

Luk*_*101 1 c# sql sql-server

只是想知道是否可以在没有linq或ORM的情况下进行延迟加载.我需要做一些不适合ORM的查询.我还需要在方法之间传递查询.此外,我找不到任何微观的动作来实现这一目标.有没有办法做到这一点?

var q = "Select Name from Test1"
Run Code Online (Sandbox Code Playgroud)

现在我们必须添加一个OR或AND或IN或其他东西

此查询将传递给要过滤的不同方法.有没有办法使用微型ORM或AD Hoc SQL查询来做到这一点?

Wul*_*ram 7

您可以直接使用datareader,也可以通过一个可以懒惰地评估它的类来完成.请参阅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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可能不得不对这个例子做一些调整,但是想法是使用DataReader并逐个读取行,并通过IEnumerable传递yield返回结果,这将导致延迟评估.然后你可以传递IEnumerable并随意阅读.请注意确保您始终如一地阅读,否则SQLConnection将在30秒后终止而没有任何活动.


Jam*_*ack 6

为什么不使用FuncAction定义您的查询,所以当您将它传递给下一个函数时,它可以在需要时执行.

它的功能就像延迟加载一样.


Kai*_*ido 5

您可以使用

懒惰<T>

为了这.它依赖于James建议的Func,但也支持缓存和线程安全.

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

编辑:既然您正在寻找ORM的其他功能,如过滤和排序,但具有编写原始SQL的灵活性,我建议您查看ORM,如实体框架或Nhibernate,并使用他们的一些原始SQL功能在适当的地方

执行Session.createSQLQuery(SQL);

ORM还允许您更强大的输入,以便在动态添加过滤器时消除错误.