DbContext - > DbSet - > Where子句缺失(实体框架6)

时间:2014-10-24 12:10:39

标签: c# entity-framework

我已经阅读了一些实体框架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指令。

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

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)

above doesnt work, bottom works

2 个答案:

答案 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子句的工作方式类似的子句。这意味着您可以跳过Where并在此方法中直接使用该子句。
  • Single仅在只有一个元素存在时才适用(适合该子句)。如果出现两个元素,则会抛出异常。
  • FirstSingle的工作方式类似,但如果存在多个项目(符合条款),则不会抛出异常。它只会返回它找到的第一个元素(适合该子句)。