簡體   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