使用Entity Framework 5运行内联SQL并返回跟踪的实体

时间:2013-06-07 12:18:34

标签: c# entity-framework-5

如何执行如下命令:

SELECT * FROM CATS

表现就像我完成了myContext.Cats.Where(c => true);

谷歌建议context.Database.ExecuteSqlCommand(),但返回一个int。还有context.Database.SqlQuery看起来很有前途,但它说没有跟踪返回的实体,我怀疑这很重要(我不太熟悉EF如何跟踪事物)。

它建议使用System.Data.Entity.DbSet<TEntity>.SqlQuery(Object[])来跟踪它,但我不完全确定这意味着什么或如何实现它。

除了让它更令人困惑之外,我想编写一个通用方法来允许我对任何表执行特定查询。

这是我在伪代码中想要的一个粗略的例子

public DbSet<T> ExecuteSelect<T>(DbContext context, string table)
{
     DbSet<T> entities = context.RunSql("SELECT * FROM " + table);

     return entities;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据这个:http://msdn.microsoft.com/en-us/data/jj592907.aspx您需要以下内容:

public IEnumerable<T> ExecuteSelect<T>(DbContext context, string table)
{
     IEnumerable<T> entities = context.Set<T>.SqlQuery("SELECT * FROM " + table).ToList();

     return entities;
}

myContext.Cats.Where(c => true)返回IQueriable<Cat>(不是DbSet)

<强> BUT

您的返回集实际上已经完成(例如,您无法在以后向查询中添加额外的位),因此将其设置为Queriable是错误的。

答案 1 :(得分:0)

您可以直接执行sql查询,如下所示:

        private int DeleteData()
    {
        using (var ctx = new MyEntities(this.ConnectionString))
        {
            if (ctx != null)
            {

                //Delete command
                return ctx.ExecuteStoreCommand("DELETE FROM ALARM WHERE AlarmID > 100");

            }
        }
        return 0;
    }

如需选择,我们可以使用

using (var context = new MyContext()) 
{ 
    var blogs = context.MyTable.SqlQuery("SELECT * FROM dbo.MyTable").ToList(); 
}