繁体   English   中英

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

[英]DbContext -> DbSet -> Where clause is missing (Entity Framework 6)

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

以上不起作用,底层工作

感谢@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仅在只有一个元素存在时才适用(适合该子句)。 如果出现两个元素,则抛出异常。
  • First类似于Single ,但如果存在多个项目(适合该子句),它不会抛出异常。 它只会返回它找到的第一个元素(拟合子句)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM