Как правильно сделать выборку из БД, используя Entity Framework?

Здравствуйте, использую Entity Framework. В моём wfa приложении есть DataGridView, которому я задаю такой DataSource:

productBindingSource.DataSource = context.Products.ToList();
metroGrid1.DataSource = productBindingSource;


Если задавать так, то всё работает (добавление, изменение), но тогда появляется проблема: в таблице есть поле menu_id и я хочу выводить не номер меню, а его название, но при такой выборке у меня это никак не получается.

Однако получается получить название меню, используя такой запрос:

var products = context.Products.Select(prd=> new
            {
                prd.id,
                prd.name,
                prd.price,
                Menu = prd.Menu.name
            });
            productBindingSource.DataSource = products.ToList();
            metroGrid1.DataSource = productBindingSource;


Но появляется другая проблема, у меня перестаёт работать добавление, изменение (ошибка в этой строчке):

productBindingSource.Add(frm.ProductInfo);

ProductInfo это свойство из 2-ой формы, которая возвращает объект типа Product:

public Product ProductInfo
        {
            get
            {
                return productBindingSource.Current as Product;
            }
        }


Текст ошибки:
Объекты, добавляемые к списку BindingSource, должны быть одного типа.

Ошибка понятна, но совершенно не понимаю как её решить. Заранее спасибо.
  • Вопрос задан
  • 700 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AIgin
Проблема в том, что запрос возвращает объекты анонимного класса, а при добавлении и изменении передаётся класс Product. Для решения проблемы есть два варианта:
1. Полученные данные из анонимного класса преобразовать в Product
productBindingSource.DataSource = products.AsEnumerable().Select(a => new Product() { id = a.id, name = a.name, price = a.price, Menu = new Menu(){ name = a.Menu.name });

AsEnumerable() (можно использовать ToList()) вызывается для выполнения запроса, без него будете получать Exception, т.к. EF не сможет разобрать такой Select().
2. Добавляемые и изменяемые данные преобразовывать из Product в анонимный класс
productBindingSource.Add(
                    new
                    {
                        frm.ProductInfo.id,
                        frm.ProductInfo.name,
                        frm.ProductInfo.price,
                        Menu = frm.ProductInfo.Menu.name
                    });;


Но следует учесть, что для добавления в БД новых записей через EF всё равно придётся потом приводить данные к классам из модели (Product)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы