Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架5运行内联SQL并返回跟踪的实体_C#_Entity Framework 5 - Fatal编程技术网

C# 使用实体框架5运行内联SQL并返回跟踪的实体

C# 使用实体框架5运行内联SQL并返回跟踪的实体,c#,entity-framework-5,C#,Entity Framework 5,如何执行以下命令: 从猫中选择* 这就像我做了myContext.Cats.Where(c=>true)一样 Google建议使用context.Database.ExecuteSqlCommand(),但它会返回一个int。还有context.Database.SqlQuery,看起来很有希望,但它说返回的实体没有被跟踪,我怀疑这很重要(我不太熟悉EF在跟踪方面的工作原理) 它建议使用System.Data.Entity.DbSet.SqlQuery(Object[])来跟踪它,但我不完全确定

如何执行以下命令:

从猫中选择*

这就像我做了
myContext.Cats.Where(c=>true)一样

Google建议使用
context.Database.ExecuteSqlCommand()
,但它会返回一个int。还有context.Database.SqlQuery,看起来很有希望,但它说返回的实体没有被跟踪,我怀疑这很重要(我不太熟悉EF在跟踪方面的工作原理)

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

除此之外,我还想编写一个通用方法,允许我对任何表执行特定的查询

下面是一个我想要的伪代码的粗略示例

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

     return entities;
}
public DbSet ExecuteSelect(DbContext上下文,字符串表)
{
DbSet entities=context.RunSql(“SELECT*FROM”+表);
返回实体;
}
有什么想法吗?

根据这一点:您需要以下内容:

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

     return entities;
}
公共IEnumerable ExecuteSelect(DbContext上下文,字符串表) { IEnumerable entities=context.Set.SqlQuery(“SELECT*FROM”+table.ToList(); 返回实体; }
myContext.Cats.Where(c=>true)
返回
IQueriable
(非DbSet)

但是


您返回的集实际上已经完成(例如,您以后不能向查询中添加额外的位),因此使其可查询是错误的

您可以直接执行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(); 
}