1

SQLクエリを実行したい.そして、取得した値をWebページにダンプします. 私はC#でSQLCommandを行うことができます。しかし、Entity Frameworkを使用してこれを行うにはどうすればよいですか。私が難しいと思う理由は、このクエリがどのテーブルで実行されるかわからないためです(これに関しては、選択クエリを解析する必要があります)。私を助けてください。

4

2 に答える 2

5
context.ExecuteStoreQuery<Product>("select * from table where id = {0}", 1);

ExecuteStoreQuery

于 2013-06-26T10:56:19.427 に答える
0

これに対する適切な回答が既にあることは認識していますが、ヒントを提供できます。Execute Around Method パターンを実装して、トランザクションの選択、挿入、および更新の両方に対して一般的なクエリを実行できます。私はこのようにしました:

internal class CommonDataTool
{
    internal delegate object SqlCommandDelegate();

    /// <summary>
    /// Use only for select where (a) return value(s) is/are expected and/or required
    /// </summary>
    /// <typeparam name="T"> Expected datacontext model return type, example: DataContext.User</typeparam>
    /// <param name="context"> The DataContext (YourDataModel) instance to be used in the transaction </param>
    /// <param name="action"> Linq to Entities action to perform</param>
    /// <returns> Returns an object that can be implicitly casted to List of T where T is the expected return type. Example: List of DataContext.User</returns>
    internal List <T> ExecuteSelect<T>(YourDataModel context, SqlCommandDelegate action)
    {
        using (context)
        {
            var retVal = action(); return ((ObjectQuery<T>)retVal).ToList();
        }
    }

    /// <summary>
    /// Use for updates and inserts where no return value is expected or required
    /// </summary>
    /// <param name="context"> The DataContext (YourDataModel) instance to be used in the transaction </param>
    /// <param name="action"> Linq to Entities action to perform</param>
    internal void ExecuteInsertOrUpdate(YourDataModel context, SqlCommandDelegate action)
    {
        using (context)
        {
            using (var transaction = context.BeginTransaction())
            {
                try
                { action(); context.SaveChanges(); transaction.Commit(); }
                catch (Exception )
                { transaction.Rollback(); throw; }
            }
        }
    }
}

public static class ObjectContextExtensionMethods
{
    public static DbTransaction BeginTransaction( this ObjectContext context)
    {
        if (context.Connection.State != ConnectionState .Open) { context.Connection.Open(); }
        return context.Connection.BeginTransaction();
    }
}

これは、次のようにデリゲート引数として渡すことができる最小限の linq クエリを使用して dataadapter を実装できるため、優れています。

var users = _dataTool.ExecuteSelect<DataContext.User>(Db, GetUsers);

private static object GetUsers()
{
    return (from u in Db.User select U).ToList();
}

もう 1 つの良い点は、linq クエリで明示的に宣言しなくても、更新/挿入がトランザクションで実行されることです。

例:

public void UpdateUser(DomainUser user)
{
_dataTool.ExecuteInsertOrUpdate(Db, () =>
        {
            Db.User.First(u => u.UserId == user.Id).Email = user.Email;
            Db.User.First(u => u.UserId == user.Id).Name = user.Name;
            Db.User.First(u => u.UserId == user.Id).LastName = user.LastName;
            Db.User.First(u => u.UserId == user.Id).Password = user.Password;
            return null;
        });    
}

ソース: http://www.marcusnordquist.com/?p=66

于 2013-06-26T11:11:09.347 に答える