Заявление о присоединении к Entity Framework

#entity-framework #lambda #expression

#entity-framework #лямбда #выражение

Вопрос:

 kitchenlist = from listkitchens in kitchenlist
                          join tblkitContacts in db.tblKitchenContacts on listkitchens.Id equals tblkitContacts.KitchenId  
                          join tblKitMedia in db.tblKitchenMedias on listkitchens.Id equals tblKitMedia.KitchenId
                          join tblKitRemits in db.tblKitchenRemittances on listkitchens.Id equals tblKitRemits.KitchenId                         
                          where tblkitContacts.Latitude != null amp;amp; tblkitContacts.Longitude != null amp;amp; tblKitMedia.KitchenId != null
                          amp;amp; tblKitRemits.KitchenId != null                         
                          select listkitchens;

 

У меня есть этот код, который объединяет три таблицы с основной таблицей tblKitchen и работает в соответствии с условием.

Если я попытаюсь присоединиться к другой таблице tblKitchenCuisines, которая имеет несколько строк для одного и того же идентификатора кухни, полный ответ выдается несколько раз для каждой кухни в зависимости от количества строк внутри tblKitchenCuisines.

 var result = kitchenlist.ToList().Select(x => new KitchenAllModel
            {
                KitchenId = x.Id,
                KitchenName = x.KitchenName,
                KitchenType = x.KitchenType,
                Area = x.Area,
                Address1 = x.Address1,
                Address2 = x.Address2,
                //CId = x.CityId,
                Pincode = x.Pincode,
                Email = x.Email,
                Website = x.Website,
                Landline = x.Landline,
                Halal = x.Halal,
                Category = x.Category,
                Branches = x.Branches,
                AvgCost = x.AvgCost,
                Fssai = x.Fssai,
                FssaiPath = x.FssaiPath,
                RegisterStatus = x.RegisterStatus,
                Rating = x.Rating,
                Offer = x.Offer,
                KitchenStatus = x.KitchenStatus,
                AreaZone = x.AreaZone,
                Logo = x.tblKitchenMedias.Where(r => r.KitchenId == x.Id).Select(r => r).FirstOrDefault().Logo,
                Banner = x.tblKitchenMedias.Where(s => s.KitchenId == x.Id).Select(s => s).FirstOrDefault().Banner,
                KDis = ("5.0").ToString(),
                GetAllcontact = x.tblKitchenContacts.Where(y => y.KitchenId == x.Id).Select(y => new KitchenContactModel
                {
                    KitchenId = y.KitchenId,
                    KicthenOwner = y.KicthenOwner,
                    LegalName = y.LegalName,
                    ContactPerson = y.ContactPerson,
                    Mobile = y.Mobile,
                    Manager = y.Manager,
                    ManagerMobile = y.ManagerMobile,
                    OwnerMobile = y.OwnerMobile,
                    Landline = y.Landline,
                    StartTime = y.StartTime,
                    EndTime = y.EndTime,
                    DeliveryTime = y.DeliveryTime,
                    Latitude = y.Latitude,
                    Longitude = y.Longitude,
                    MapString = y.MapString,
                    ContactStatus = y.ContactStatus,
                }
                            ).ToList(),
                GetAllCuisines = x.tblKitchenCuisines.Where(z => z.KitchenId == x.Id ).Select(z => new KitchenCuisinesModel
                {
                    KitchenId = z.KitchenId,
                    CuisinesId = z.CuisinesId,
                    Id = z.Id,
                    CuisinesName = z.Cuisine.Name,

                }
                            ).ToList(),
                GetAllRemittance = x.tblKitchenRemittances.Where(a => a.KitchenId == x.Id).Select(a => new KitchenRemittanceModel
                {
                    KitchenId = a.KitchenId,
                    LegalName = a.LegalName,
                    BankName = a.BankName,
                    AccountNo = a.AccountNo,
                    IFSCCode = a.IFSCCode,

                }
                            ).ToList(),
                //GetAllMedia =x.tblKitchenMedias.Where(b=>b.KitchenId==x.Id).Select(b=> new KitchenMediaModel
                //{
                //    KitchenId =b.KitchenId,
                //    Banner=b.Banner,
                //    Logo=b.Logo,
                //    Id =b.Id,

                //}
                //).ToList(),

            }
            ).ToList();
            return resu<

 

Я хочу присоединиться к tblKitchenCuisines и добавить условие для игнорирования Kitchen, которое имеет нулевые записи в таблице, а также не вызывает многократных повторений.

Пожалуйста, помогите

Комментарии:

1. ASP.NET это веб-стек, он не загружает данные. Для этого и нужен EF. Хотя EF является ORM, ему не нужны объединения. Он генерирует их из отношений между объектами. DbContext не является подключением к базе данных, сущность не является таблицей. Если вам нужно использовать объединения, в вашей модели отсутствуют отношения

2. Соединения работают нормально, поскольку в одной таблице есть несколько строк, которые я соединяю с основной таблицей, связанной с Id, мне нужно взять только строку FirstOrDefault, которую я не могу выполнить с помощью оператора joins (выражение Lamdba)

3. Нет, это не так. В противном случае вы бы не публиковали здесь. В EF нет таблиц, в нем есть сущности с отношениями. Вот почему вы никогда не видите соединение между Blog и Post в руководствах, вы видите blog.Posts . Соединение будет сгенерировано самим EF. Вам не пришлось бы загружать целые таблицы в память с помощью ToList()

4. В моем выражении, как я могу выбрать или ОБЪЕДИНИТЬ только 1-ю строку и 4-ю таблицу объединения? Не могли бы вы предложить?

5. Исправьте свои отношения, чтобы вам не нужны были объединения. Если вы хотите быстро загрузить все кухни и связанные с ними объекты, вы можете добавить .Include() для любого отношения, которое вы также хотите загрузить, например db.Kitchens.Include(k=>k.Contacts).Include(k=>k.Meddia).Where(...)... . Объединения не требуются. Если вы не хотите быстро загружать отношения, вы можете просто перебирать результаты, и EF загрузит необходимые объекты один за другим.