#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 загрузит необходимые объекты один за другим.