DbContext -> DbSet -> Where 子句缺失(Entity Framework 6)

15

我阅读了一些使用实体框架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'的查询模式没有实现。'Where'未找到。可能缺少对'System.Link'的引用或using指令。

如果我尝试自动完成方法,就不会有任何方法。

VS2013

为什么它不起作用?:(

// 编辑: 将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)

上面的不行,下面的可以


6
System.Linq 引用已添加到命名空间吗? - Sefa
Wtf!? 在使用上述字符串的文件顶部添加“using System.Linq”解决了问题... 有趣的事情是... 你能再检查一下这个问题吗?我也遇到了一个关于System.Linq的问题。谢谢!! - PatrickB
2
查询返回了一个 System.Linq.IQueryable<User> 类型的结果,您试图将其放入 User 类型的变量中。我猜您需要在查询结尾加上 First() 方法。 - Joe
2个回答

55

感谢 @Grant Winney 和 @Joe。

using System.Linq; 添加到我正在尝试上面的代码所在的命名空间/文档顶部,可以解决问题。

并且使用上面的行可以适用于列表中的第一项。

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

2
你甚至在2019年用Entity Framework Core 3预览版拯救了我的时间。 - Eino Mäkitalo

2
第二个问题在于你的期望值:
User u = from user in context.Users where user.Username == username select user;

你期望返回一个元素。但是,Where 子句返回一个列表(IEnumerable)的项。即使只有一个符合 where 子句的实体,它仍将返回一个列表(其中只有一个项)。
如果您想要单个项目,则需要获取该列表的 .First().Single() 项。
一些注意事项:
- 我刚才提到的任何一种方法都可以采用类似于 where 子句的子句。这意味着您可以跳过 where 并将子句直接放入此方法中。 - Single 仅在存在一个元素(符合该子句)时起作用。如果出现两个元素,将引发异常。 - First 的工作方式类似于 Single,但如果存在多个项目(符合该子句),它不会引发异常。它将简单地返回它找到的第一个元素(符合该子句)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接