DbContext – > DbSet – >缺少Where子句(Entity Framework 6)

我已经阅读了一些entity framework6的教程……

基础很简单。

using (var context = new MyContext()) { User u = context.Users.Find(1); } 

但是如何在“DbSet”上与用户一起使用“Where”或其他内容?

 public class MyContext : DbContext { public MyContext() : base("name=MyContext") { //this.Database.Log = Console.Write; } public virtual DbSet Users { get; set; } } 

用户

 [Table("User")] public class User : Base { public Guid Id { get; set; } [StringLength(100)] public string Username { get; set; } } 

这就是不起作用的问题。

 string username = "Test"; using (var context = new MyContext()) { User u = from user in context.Users where user.Username == username select user; } 

错误:源类型“DbSet”的查询模式没有实现。 找不到“哪里”。 可能缺少“System.Link”的引用或using指令。

如果我尝试自动完成方法,则没有。

VS2013

为什么它不起作用? 🙁

//编辑:将System.Linq添加到文件顶部会更改上述问题的function,以便我不再有问题。

但为什么现在where错了?

 The type "System.Linq.IQueryable" cant converted into "User" explicit. There already exists an explicit conversion. (Possibly a cast is missing) 

以上不起作用,底层工作

感谢@Grant Winney和@Joe。

using System.Linq;添加using System.Linq; 到文档的命名空间/顶部我正在修改上面的代码修复了问题。

使用上面的行,它适用于列表的第一项。

 User user = (select user from context.Users where user.Username == username select user).First(); 

(第二个)问题在于你所期望的:

 User u = from user in context.Users where user.Username == username select user; 

你期待一个元素。 但Where子句返回一个列表(IEnumerable)的项目。 即使只有一个实体符合where子句,它仍然会返回一个列表(其中包含一个项目)。

如果需要单个项目,则需要获取该列表的.First().Single()项。

一些考虑:

  • 我刚才提到的任何一种方法都可以采用类似于where子句如何工作的子句。 这意味着您可以跳过Where并在此方法中直接放置子句。
  • Single仅在只有一个元素存在时才适用(适合该子句)。 如果出现两个元素,则抛出exception。
  • First类似于Single ,但如果存在多个项目(适合该子句),它不会抛出exception。 它将简单地返回它找到的第一个元素(拟合子句)。