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指令。
如果我尝试自动完成方法,则没有。
为什么它不起作用? 🙁
//编辑:将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。 它将简单地返回它找到的第一个元素(拟合子句)。