我已经阅读了一些实体框架6的教程......
基础很简单。
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<User> 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添加到文件顶部会更改上述问题的功能,以便我不再有问题。
但为什么where
现在错了?
The type "System.Linq.IQueryable<User>" cant converted into "User" explicit. There already exists an explicit conversion. (Possibly a cast is missing)
答案 0 :(得分:32)
感谢@Grant Winney和@Joe。
将using System.Linq;
添加到文档的命名空间/顶部我正在修改问题。
使用上面一行,它适用于列表的第一项。
User user = (select user from context.Users where user.Username == username select user).First();
答案 1 :(得分:2)
(第二个)问题在于你所期望的:
User u = from user in context.Users where user.Username == username select user;
你期待一个元素。但是Where
子句返回项目的列表(IEnumerable)。即使只有一个实体符合where子句,它仍会返回一个列表(其中包含一个项目)。
如果您想要单个项目,则需要获取该列表的.First()
或.Single()
项。
一些注意事项:
Where
并在此方法中直接使用该子句。Single
仅在只有一个元素存在时才适用(适合该子句)。如果出现两个元素,则会抛出异常。First
与Single
的工作方式类似,但如果存在多个项目(符合条款),则不会抛出异常。它只会返回它找到的第一个元素(适合该子句)。