如何执行如下命令:
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;
}
有什么想法吗?
答案 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();
}