powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF Core
12 сообщений из 12, страница 1 из 1
EF Core
    #40083846
maximIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Есть такая вот модель:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    public class Building
    {

        [System.ComponentModel.DataAnnotations.Key]
        public int Id { get; set; }
        public string Info { get; set; }
        public string ObjectName { get; set; }
        public string BuilderName { get; set; }
        [NotMapped]
        public bool Check { get; set; }
        public List<CompanyBuilding> BuildingCompanys { get; set; }
       
    }

    public class CompanyBuilding
    {
        public Guid CompanyId { get; set; }
        public int BuildingId { get; set; }
        public Building Building { get; set; }
     }



и есть вот такое заполнение данных

Код: c#
1.
Context.WebBuildings.Include(x => x.BuildingCompanys.Where(e => e.CompanyId == id)).AsNoTracking().ToList()



скл при этом формирует вот такой запрос (я его изменил для наглядности, подставив значение вместо параметра)

Код: sql
1.
2.
3.
4.
5.
6.
SELECT        w.Id, w.BuilderName, w.Info, w.ObjectId, w.ObjectName, t0.BuildingID, t0.CompanyID
FROM            WebBuildings AS w LEFT OUTER JOIN
                             (SELECT        BuildingID, CompanyID
                               FROM            tblOutCompanyBuildings AS t
                               WHERE        (CompanyID = '227F15D8-574F-46C4-7A51-08D909E053F9')) AS t0 ON w.Id = t0.BuildingID
ORDER BY w.Id, t0.BuildingID, t0.CompanyID



Это почти то что надо но есть два вопроса:

1. Мне здесь не хватает условия WHERE (t0.BuildingID IS NULL) т.е. чтобы было так
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT        w.Id, w.BuilderName, w.Info, w.ObjectId, w.ObjectName, t0.BuildingID, t0.CompanyID
FROM            WebBuildings AS w LEFT OUTER JOIN
                             (SELECT        BuildingID, CompanyID
                               FROM            tblOutCompanyBuildings AS t
                               WHERE        (CompanyID = '227F15D8-574F-46C4-7A51-08D909E053F9')) AS t0 ON w.Id = t0.BuildingID
WHERE        (t0.BuildingID IS NULL)
ORDER BY w.Id, t0.BuildingID, t0.CompanyID



Я уже все перепробовал но достичь именно такого условия не получается. Я понимаю что нужно как-то так

Код: c#
1.
Context.WebBuildings.Include(x => x.BuildingCompanys.Where(e => e.CompanyId == id)).Where(x => x.BuildingCompanys == null).AsNoTracking().ToList()



Но скл делает условия WHERE 0 = 1


2. Как избавиться от ORDER BY. Т.е. чтобы формировался скл запрос без него
...
Рейтинг: 0 / 0
EF Core
    #40084001
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maximIZ,
Код: c#
1.
 public int BuildingId { get; set; }

->
Код: c#
1.
 public int? BuildingId { get; set; }


не?
а то какбе EF не знает, что он может быть null
...
Рейтинг: 0 / 0
EF Core
    #40084212
maximIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но нет. Это не то. Я конечно попробовал, но толку ноль.
...
Рейтинг: 0 / 0
EF Core
    #40084311
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maximIZ,

это то :)
усли у вас в модели используется not nullable значение, то смысл писать выражение x=>x.SomeProperty == null для меня и для EF теряется

ожидание
авторМне здесь не хватает условия WHERE (t0.BuildingID IS NULL) т.е. чтобы было так
но вы пишете
автор.Where(x => x.BuildingCompanys == null) где BuildingCompanys коллекция, соотв. это выражение вообще не имеет смысла.

если вам действительно нужно выбрать все у кого BuildingID пустые (null)
то нужно что-то вроде этого
Код: c#
1.
.Where(x => x.BuildingCompanys.Any(b=>b.BuildingId  == null))


ну и BuildingId должно быть nullable.
...
Рейтинг: 0 / 0
EF Core
    #40084352
maximIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,
попробовал но скл все равно генерирует скрипт вроде


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
exec sp_executesql N'SELECT [w].[Id], [w].[BuilderName], [w].[Info], [w].[ObjectName], [t0].[BuildingId], [t0].[CompanyId]
FROM [WebBuildings] AS [w]
LEFT JOIN (
    SELECT [t].[BuildingId], [t].[CompanyId]
    FROM [tblOutCompanyBuildings] AS [t]
    WHERE [t].[CompanyId] = @__id_0
) AS [t0] ON [w].[Id] = [t0].[BuildingId]
WHERE 0 = 1
ORDER BY [w].[Id], [t0].[BuildingId], [t0].[CompanyId]',N'@__id_0 uniqueidentifier',@__id_0='227F15D8-574F-46C4-7A51-08D909E053F9'



где условие WHERE 0 = 1
...
Рейтинг: 0 / 0
EF Core
    #40084364
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maximIZ,

покажите linq который вы сейчас используете и определение модели
...
Рейтинг: 0 / 0
EF Core
    #40084421
maximIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,

Код: c#
1.
2.
3.
4.
5.
6.
    public class CompanyBuilding
    {
        public Guid? CompanyId { get; set; }
        public int BuildingId { get; set; }
        public Building Building { get; set; }
    }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    public class ApplicationContext : DbContext
    {
            public DbSet<Building> WebBuildings{ get; set; }
            public DbSet<CompanyBuilding> tblOutCompanyBuildings { get; set; }
            public ApplicationContext(DbContextOptions<ApplicationContext> options): base(options)
            {
                Database.EnsureCreated();
            }
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<CompanyBuilding>().HasKey(k => new { k.BuildingId, k.CompanyId });
            }
    }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public IActionResult OnGet(Guid? id)
    {
            if (id == null)
            {
                return NotFound();
            }

            Buildings = Context.WebBuildings.Include(x => x.BuildingCompanys.Where(e => e.CompanyId == id)).Where(x => x.BuildingCompanys.Any(b => b.CompanyId == null)).AsNoTracking().ToList();

            return Page();
   }
...
Рейтинг: 0 / 0
EF Core
    #40084560
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: c#
1.
.Where(e => e.CompanyId == id)).Where(x => x.BuildingCompanys.Any(b => b.CompanyId == null)


тут какое-то противоречие, нет?

и
Код: c#
1.
2.
3.
4.
5.
6.
 public class CompanyBuilding
    {
        public Guid? CompanyId { get; set; }
        public int BuildingId { get; set; }
        public Building Building { get; set; }
    }



+
Код: c#
1.
 modelBuilder.Entity<CompanyBuilding>().HasKey(k => new { k.BuildingId, k.CompanyId });


ключ не может быть налбл
...
Рейтинг: 0 / 0
EF Core
    #40084604
maximIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,
Ну так я вам об этом и говорил. Что это не верный подход. Мне нужно Все Buildings которые отсутствуют я таблице CompanyBuilding для конкретной компании. Вот и пытаюсь понять как задать условие, аналогичное скл условию WHERE (t0.BuildingID IS NULL) или WHERE (t0.CompanyID IS NULL)

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT        w.Id, w.BuilderName, w.Info, w.ObjectId, w.ObjectName, t0.BuildingID, t0.CompanyID
FROM            WebBuildings AS w LEFT OUTER JOIN
                             (SELECT        BuildingID, CompanyID
                               FROM            tblOutCompanyBuildings AS t
                               WHERE        (CompanyID = '227F15D8-574F-46C4-7A51-08D909E053F9')) AS t0 ON w.Id = t0.BuildingID
WHERE        (t0.BuildingID IS NULL)
ORDER BY w.Id, t0.BuildingID, t0.CompanyID



Я ведь создаю модель идентичную модели в скл. Где в таблице tblOutCompanyBuildings составной ключ из двух полей BuildingID и CompanyID. Ни одно из которых не может быть пустым
...
Рейтинг: 0 / 0
EF Core
    #40084608
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может лучше на not exists ориентироваться:
https://stackoverflow.com/questions/9031008/how-to-select-where-not-exist-using-linq
...
Рейтинг: 0 / 0
EF Core
    #40084612
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maximIZ,

авторМне нужно Все Buildings которые отсутствуют я таблице CompanyBuilding для конкретной компании
с этого надо было начинать :D
как-то так, наверное
Код: c#
1.
Context.WebBuildings.Where(x=> !Context.CompanyBuildings.Where(c=>c.CompanyId == companyId).Any(t=>t.BuildingId =x.Id))
...
Рейтинг: 0 / 0
EF Core
    #40084758
maximIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем спасибо, через вложенный запрос не получилось как я и хотел, но через экзист вполне себе годно

Код: c#
1.
Buildings = Context.WebBuildings.Where(b => !Context.tblOutCompanyBuildings.Where(cb => cb.BuildingId == b.Id && cb.CompanyId == id).Any()).AsNoTracking().ToList();
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF Core
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (39): Анонимы (36), Bing Bot, Yandex Bot 1 мин., Google Bot 4 мин.
x
x
Закрыть


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