powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно сделать выборку из БД, используя Entity Framework?
8 сообщений из 8, страница 1 из 1
Как правильно сделать выборку из БД, используя Entity Framework?
    #39370587
Daniil S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, использую Entity Framework. В моём wfa приложении есть DataGridView, которому я задаю такой DataSource:

Код: c#
1.
2.
productBindingSource.DataSource = context.Products.ToList();
metroGrid1.DataSource = productBindingSource;



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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var products = context.Products.Select(prd=> new
            {
                prd.id,
                prd.name,
                prd.price,
                Menu = prd.Menu.name
            });
            productBindingSource.DataSource = products.ToList();
            metroGrid1.DataSource = productBindingSource;



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

Код: c#
1.
productBindingSource.Add(frm.ProductInfo);



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

Код: c#
1.
2.
3.
4.
5.
6.
7.
public Product ProductInfo
        {
            get
            {
                return productBindingSource.Current as Product;
            }
        }



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

Ошибка понятна, но совершенно не понимаю как её решить. Заранее спасибо.
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39370618
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Daniil S.,

Жесть какая... биндинг на ToList? А если там товаров будет 100 тысяч? Умрёт твоё приложение.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class ProductDto
{
   public int id {get; set;}
   public string name {get; set;}
   public decimal price {get; set;}
   public string Menu {get; set;}
}

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


productBindingSource.Add(new ProductDto{...});



Т.е. как решить можно ошибку вида

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

...наверное надо работать с одним типом. В списке и добавляемый объекты должны быть одного типа.
Одного типа!

Никак иначе это решить нельзя, кроме как работать с одним типом. Какие ещё могут тут быть решения?
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39370805
Daniil S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Спасибо, но у меня всё равно не получается. Дело в том, что у меня DataBase First приложение и EF сам сгенерировал мне классы, вот класс Product:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace RestrauntCMS
{
    using System;
    using System.Collections.Generic;
    
    public partial class Product
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Product()
        {
            this.Positions = new HashSet<Position>();
        }
    
        public long id { get; set; }
        public string name { get; set; }
        public Nullable<long> price { get; set; }
        public Nullable<long> menu_id { get; set; }
        public Nullable<long> date_add { get; set; }

    
        public virtual Menu Menu { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Position> Positions { get; set; }
    }
}



Пытаюсь сделать так, как вы мне написали:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var products = context.Products.Select(prd => new Product
            {
                id = prd.id,
                name = prd.name,
                price = prd.price,
                Menu = prd.Menu.name
            });
            
            productBindingSource.DataSource = products.ToList();
            metroGrid1.DataSource = productBindingSource;



Но тогда подчёркивает строку
Код: c#
1.
Menu = prd.Menu.name



говорит, что не может преобразовать тип string в RestrauntCMS.Menu

Пожалуйста помогите найти компромисс.
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39371147
B7_Ruslan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Daniil S.,

Тут надо поработать сделать свой источник, унаследованный от IBindingList.
Внутри уже использовать запросы через EF.
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39371164
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Daniil S.,

Нельзя использовать класс Product в запросах. Ты можешь запрашивать только чистые Product. Если хочешь другой набор данных, определи свой дополнительный класс.

Я же показал в примере, создай отдельный класс ProductDto, он не должен быть классом EF и маппиться на таблицу.
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39371260
Daniil S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Подскажите пожалуйста, что это означает и как это реализовать?
hVosttон не должен быть классом EF и маппиться на таблицу.
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39371323
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Daniil S.,

Это значит, что если EF сгенерировал классы, например, Product, значит эти классы нельзя использовать вот так:

Код: c#
1.
context.Products.Select(prd => new Product



можно только так:

Код: c#
1.
context.Products.Select()



Если ты хочешь выбрать отдельные поля, или поля из навигационных полей, например, там меню или чего ты хочешь, надо создавать свой отдельный класс и выбирать в него:

Код: c#
1.
context.Products.Select(prd => new ProductDto { ... } )...



Видишь разницу? Product это класс который сгенерировал EF, а ProductDto это класс который ты сам создал. Ты можешь назвать его по-другому.

Как ещё объяснить?
...
Рейтинг: 0 / 0
Как правильно сделать выборку из БД, используя Entity Framework?
    #39371325
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Daniil S.,

Это касательно ошибки, которую ты хочешь победить. Но в целом, ты изначально всё делаешь неправильно. Найди какую-нибудь книжку, уроки, примеры какие-нибудь и изучай их. Одно дело подсказать, другое дело с нуля научить. На форуме никто тебя не научит, это невозможно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно сделать выборку из БД, используя Entity Framework?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]