我使用的是EF6,但我不知道它和早期版本之间是否有任何区别。
我有以下背景:
public IdentityContext()
: base("name=Identity")
{
Database.SetInitializer<IdentityContext>(null);
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
Configuration.ValidateOnSaveEnabled = false;
Configuration.AutoDetectChangesEnabled = true;
Database.Log = logInfo => Debug.WriteLine(logInfo);
}
public DbSet<AspNetRole> AspNetRoles { get; set; }
public DbSet<AspNetUserClaim> AspNetUserClaims { get; set; }
public DbSet<AspNetUserLogin> AspNetUserLogins { get; set; }
public DbSet<AspNetUser> AspNetUsers { get; set; }
我想做的是针对此发出SQL查询:
我看到了一个例子(与我的背景无关):
using (var context = new BloggingContext())
{
var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}
但这对我没有任何意义,因为我无法理解为什么在上下文之后存在.Blogs。
对于我上面的上下文,有人可以解释我如何发出一个简单的sql语句来从AspNetUser表中获取Id并将它们放在一个集合中。
请注意,我使用的是EF6,但在这种情况下,如果我查询上下文,我不确定这个问题是否相关。我真正的需求是复杂的SQL,但首先我需要一些建议让我开始。感谢。
答案 0 :(得分:1)
如果您正在使用.SqlQuery,那么您可以绕过使用LINQ样式的lambda表达式查询数据库的美妙之处。
您可能需要稍微调整语法,但是这样的事情应该适用于获取用户ID的初始要求:
var allMyIds = context.AspNetUserLogins.Select(l => l.Id).ToList();
或者,如果您愿意......
var allMyIds = (from l in context.AspNetUserLogins
select l.Id).ToList();
但是,如果你真的需要直接执行SQL,你可以在你的问题中在其中一个DBSet类上进行(在这种情况下,EF会对更改跟踪做出勇敢的尝试),或者如果它是一般查询你只是想执行返回原始类型而不是特定于任何一个表,使用Database
对ExecuteSqlCommand
类执行:
var allMyIds = context.Database.ExecuteSqlCommand("select id from AspNetUserLogins");
希望有所帮助!