2014-10-24 2 views
6

Я прочитал некоторые учебники с рамкой сущности 6 ...DbContext -> DbSet -> Где пункт отсутствует (Entity Framework 6)

Основы легки.

using (var context = new MyContext()) 
{ 
    User u = context.Users.Find(1); 
} 

Но как использовать «Где» или что-то еще на «DbSet» с пользователями?

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».

Если я пытаюсь автозаполнять методы, их нет.

VS2013

Почему оно не работает? :(

// Edit: Добавление 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

+3

- ссылка System.Linq, добавленная в пространство имен? – Sefa

+8

Это 'System.Linq', а не' System.Link', и вам нужно включить его с другими «использующими» директивами в верхней части файла. –

+0

Wtf !? Добавление «using System.Linq» в верхней части файла, где я использую строку выше исправленной проблемы ... Забавная вещь ... Можете ли вы перепроверить вопрос. Я добавил, что проблема связана с System.Linq. Благодаря!! – PatrickB

ответ

22

Благодаря @Grant Winney и @Joe.

Добавление using System.Linq; к пространству имен/верхней части документа, где я выполняю код выше, исправил проблему.

И используя линию над ней, она работает для первого элемента списка.

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

Ты спас мой день ..... –

1

(Вторая) проблема заключается в том, что вы ожидаете:

User u = from user in context.Users where user.Username == username select user; 

Вы ожидали одного элемента. Но предложение Where возвращает список (IEnumerable) элементов. Даже если есть только одна сущность, которая соответствует предложению where, она все равно вернет список (с одним элементом в нем).

Если вам нужен один элемент, вам нужно либо взять .First(), либо пункт .Single() этого списка.

Некоторые соображения:

  • Либо метод, который я только что упомянул может принять положение, подобно тому, как работает, где положение. Это означает, что вы можете пропустить Where и поместить предложение прямо в этот метод.
  • Single работает только в том случае, если существует только один элемент (установка предложения). Если возникают два элемента, будет выбрано исключение.
  • First работает подобно Single, но он не будет генерировать исключение, если существует несколько элементов (установка предложения). Он просто вернет первый элемент, который он находит (подгоняя предложение).
Смежные вопросы