388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
1

FromSqlRaw() сломанный метод

10.06.2020, 16:28. Показов 1680. Ответов 13

Author24 — интернет-сервис помощи студентам
проект кор 3.1, EF для работы с базой, база postgres10
есть строка для запроса вида:
SQL
1
2
3
4
SELECT "Поле1", "Поле2"
FROM "Таблица"
WHERE "Поле1" IN('значение11') 
AND "Поле2" IN('значение21','значение22','значение23')
после чего используем FromSqlRaw() или его клоны
C#
1
var result= await context.FromSqlRaw(наш запрос)
что мы должны получить и что получали в 2.2 кор:
...
..."Поле1"='значение11', "Поле2"='значение21',...
..."Поле1"='значение11', "Поле2"='значение22',...
..."Поле1"='значение11', "Поле2"='значение23',...
...
перешел на кор3.1 и имеем:
...
..."Поле1"='значение11', "Поле2"='значение23',...
..."Поле1"='значение11', "Поле2"='значение23',...
..."Поле1"='значение11', "Поле2"='значение23',...
...
куча одинаковых строчек из последнего условия
SQL
1
 AND "Поле2" IN(...'значение23')
сомневаюсь что если использовать процедуру это спасет от кривого мапинга данного метода

все библиотеки последней версии
сносил, скачивал заново
результат тот же, метод дичь творит
что делать? откатываться?

а как же solid?врут?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2020, 16:28
Ответы с готовыми решениями:

Сломанный счетчик
Почему то при выигрыше или поражении счетчик очень странно себя ведет. При первом...

Сломанный интерфейс SATA
Возникла такая проблема. Сломали SATA интерфейс жесткого диска. Не программно, а физически. Стали...

Сломанный водяной насос
Всем привет. Нужна ваша помощь, разобрал сломанный насос, плата залита черным "клеем", насос...

И снова сломанный XE4 :(
Здравствуйте! Не работает Delphi XE4. Работа стоит, починить никак не могу. ОС: Windows 7...

13
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
11.06.2020, 12:28  [ТС] 2
перешел на даппер и все заработало
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
11.06.2020, 21:39 3
Можно полный пример на котором воспроизводится ошибка?
0
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
16.06.2020, 14:40  [ТС] 4
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Можно полный пример на котором воспроизводится ошибка?
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class Startup
{
             ...
        public void ConfigureServices(IServiceCollection services)
        {
             ...
            services.AddTransient<IRepository, Repository>();
            services.AddTransient<IService, Service>();
             ...
        }
             ...
}
C#
1
2
3
4
5
6
7
8
9
public class Repository : IRepository
{
             ...
        public Task<IQueryable<T>> Sql<T>(string item) where T : class
        {
            return Task.FromResult(_context.Set<T>().FromSqlRaw(item));
        }
             ...
}
C#
1
2
3
4
5
6
7
8
9
10
11
public class Service : IService
{
             ...
        public async Task Search(....)
        {
             ...
            var result = await _repository.Sql<ModelDB>("тут sql запрос либо вызов функции с постгреса").ConfigureAwait(false);
             ...
        }
             ...
}
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
16.06.2020, 14:58 5
Dr9vik, полный пример а не схематический.
Я о том что ты либо нашёл баг (в чем я очень сомневаюсь) которой можно (и нужно) зарепортить, либо не разобравшись в технологии наговариваешь (что более вероятно).
0
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
16.06.2020, 18:49  [ТС] 6
Цитата Сообщение от nicolas2008 Посмотреть сообщение
полный пример а не схематический.
создал стандартный проект в вижле на коре
повторил логику рабочего проекта
убрал промежуточные места
и обратился в туже таблицу, в той же базе
и...я получил тот же результат

список нагетов в приложение

стартап:
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
35
36
37
38
39
40
41
42
43
44
45
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            _configuration = configuration;
        }
 
        public IConfiguration _configuration { get; }
 
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(
                options => options.UseNpgsql(_configuration.GetConnectionString("DeveloperPOSTRESQL"),
                optionsBuilder => optionsBuilder.MigrationsAssembly("base").CommandTimeout(600)));
            services.AddControllersWithViews();
        }
 
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
 
            app.UseRouting();
 
            app.UseAuthorization();
 
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
конфигурация таблицы в базе:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    internal class ModelConfiguration : IEntityTypeConfiguration<Model>
    {
        public void Configure(EntityTypeBuilder<Model> builder)
        {
            builder.ToTable("Model");
 
            builder.HasKey(p => p.Id);
 
            builder.Property(x => x.Data).IsRequired();
 
            builder.Property(x => x.TimeAdd).IsRequired();
        }
    }
контекст:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        {
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
 
            modelBuilder.ApplyConfiguration(new ModelConfiguration());
        }
        public DbSet<Model> Models { get; set; }
    }
контроллер:
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
    public class HomeController : Controller
    {
        protected readonly ApplicationDbContext _context;
        public HomeController(ApplicationDbContext context)
        {
            _context = context;
        }
 
        public async Task<IActionResult> Index()
        {
            string b = @"SELECT"
                + " \"Model\".\"OneId\" as \"Id\","
                + " \"Model\".\"OneId\","
                + " \"Model\".\"TwoId\","
                + " \"Model\".\"Data\" AS \"Data\","
                + " \"Model\".\"TimeAdd\""
                + " FROM \"Model\""
                + " WHERE"
                + "  \"Model\".\"OneId\" In(" + "'dc38811f-b688-4bf8-ac5d-c51bdd4845a2'" + ")"
                + " AND \"Model\".\"TwoId\" In(" + "'b27e8951-3683-4166-a46f-a968bc8168ff', 'd286ae93-85cb-43d7-9659-e74695ea6327','d28f54e6-bc44-4e0e-a026-c0a308786a1f'" + ")";
 
            var result = (await Task.FromResult(_context.Set<Model>().FromSqlRaw(b))).ToList();
            return View();
        }
    }
последняя картинка с .distinct()(удаляет повторения в коллекции)
Миниатюры
FromSqlRaw() сломанный метод  
0
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
16.06.2020, 19:01  [ТС] 7
qqq
Миниатюры
FromSqlRaw() сломанный метод   FromSqlRaw() сломанный метод  
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
16.06.2020, 19:47 8
А ничего что ключи у всех записей одинаковые?
0
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
16.06.2020, 20:10  [ТС] 9
Цитата Сообщение от nicolas2008 Посмотреть сообщение
А ничего что ключи у всех записей одинаковые?
у вас зрение плохое
проверьте его
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
16.06.2020, 20:44 10
Со зрением все в порядке, спасибо.
Свойство Id в конфигурации обозначено как ключ (HasKey(x => x.Id)).
На последнем скрине, там где distinct, Id равняется dc38811f-...
На предпоследнем скрине где шесть строк в базе есть две колонки с таким значением. В обоих колонках все значения одинаковые и равняются тому же dc38811f-...
0
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
16.06.2020, 21:12  [ТС] 11
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Со зрением все в порядке, спасибо.
Свойство Id в конфигурации обозначено как ключ (HasKey(x => x.Id)).
На последнем скрине, там где distinct, Id равняется dc38811f-...
На предпоследнем скрине где шесть строк в базе есть две колонки с таким значением. В обоих колонках все значения одинаковые и равняются тому же dc38811f-...
@"SELECT"
+ " "Model"."OneId" as "Id","
+ " "Model"."OneId","
зрение то плохое я понимаю
если вас это коробит, то поясню
энтити при мапинге требует наличие какого нибудь значения в поле Id
вообщем костыль
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
16.06.2020, 21:23 12
Не какого-нибудь а уникального ключа, который не повторяется в строках таблицы.
Костыль это то что вы сделали проигнорировав требование EF.
1
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
16.06.2020, 23:41  [ТС] 13
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Не какого-нибудь а уникального ключа, который не повторяется в строках таблицы.
Костыль это то что вы сделали проигнорировав требование EF.
в чем смысл этого правила?
если в запросе будет групировка, то Id неоткуда взять кроме как на стороне базы его сгенерировать
зачем заниматься лишней работай, причем еще бессмысленной ?
в этом плане как в кор2.2 логичнее, там все работало
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
17.06.2020, 01:23 14
Dr9vik,
Суть в том что EF следит за состоянием обьектов и при выполнении SaveChanges автоматически обновляет/удаляет соответствующие обьекти в базе.
А чтобы формировать запросы на обновление/удаление определенных строк надо как то их идентифицировать.
В случае GroupBy или даже просто Select результатом будет проекция а не сущность. За такими обьектами EF естественно никак не следит поэтому с подобными запросами проблем нет.

Странно что в версии 2.2 это работает по другому. Но в любом случае там это проблема просто вылезет с другой стороны - при сохранении будут скорее всего обновлены все строки с указанным Id если он не уникален.
0
17.06.2020, 01:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2020, 01:23
Помогаю со студенческими работами здесь

Сломанный или новый, но разницы нет
Доброго. У меня немного странная проблема. На днях сильным ударом по ноуту с сломал свой винт....

Про Siri, авиарежим и сломанный экран
Включил через siri авиарежим, она меня предупредила, что перестанет работать и перестала работать....

Найти вероятность извлечь сломанный телефон из второго ящика
Имеются два ящика с телефонами. В первом ящике 12 штук, во втором 10, причем в каждом по одному...

Как восстановить файл повредившийся в процессе перемещения на сломанный жесткий диск?
У меня такое часто бывает - по ошибке не копирую файл, а перемещаю, но мой жёсткий диск, даёт сбой...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Написать три алгоритма решения СЛАУ: Метод прогонки, метод квадратных корней, метод вращений
Начал писать курсовую. Нужно написать три алгоритма решения СЛАУ: прогонки, квадратных корней,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru