void load3(long id_pro)
{
var data3 = from p in db.Product_details
join c in db.LoaiSps
on p.id_loai equals c.id_Loai
where p.id_loai == (from d in db.Product_details
where d.id_product_detail == id_pro
select d.id_loai)
select p;
if (data3 != null && data3.Count() > 0)
{
product3 = data3.ToList();
}
}
Я попытался просмотреть сообщение человека, у которого была такая же проблема, как и у меня, добавив First() или Single(), но, похоже, это все равно не работает.
Даже в случае SQL этот запрос завершится неудачей, если не будет возвращено никаких результатов или будет возвращено более 1 результата. Я удивлен, что он вообще компилируется. Что этот код пытается запросить? EF (и любому другому ORM) не нужны JOIN, их работа — генерировать JOINS из отношений. ORM позволяют вам работать с объектами приложения вместо таблиц, они не предназначены для написания встроенного SQL.
В любом случае ошибка очевидна: нельзя сравнивать одно значение с запросом, который может возвращать 1, 1000 или вообще не возвращать результатов. Правильный запрос LINQ будет выглядеть, например, db.Produtcs.Include(p=>p.Details).ThenInclude(d=>d.Loads).ToList()
Выражение if (data3 != null && data3.Count() > 0)
тоже плохое. data3
— это запрос, а не данные, и он никогда не может быть нулевым. data3.Count()
выполняет этот запрос. При этом запрос data3
выполняется дважды, тогда как только data3.ToList()
будет иметь одинаковый результат.
избегайте подвыбора
var data3 = from p in db.Product_details
join c in db.LoaiSps
on p.id_loai equals c.id_Loai
where db.Product_details == id_pro
select p
if (data3.Any())
{
product3 = data3.ToList();
}
Мне кажется, это правильный запрос:
void load3(long id_pro)
{
var data3 =
(
from p in db.Product_details
where p.id_product_detail == id_pro
join c in db.LoaiSps on p.id_loai equals c.id_Loai
select p
).ToArray();
if (data3.Any())
{
product3 = data3.ToList();
}
}
Я бы также сказал, что .Any()
не нужен, поскольку вполне вероятно, что вы захотите обновить product3
, если данные пусты.
не имеет ли смысла добавлять второе слово непосредственно в запрос? Поэтому писать
where p.id_product_detail == id_pro
вместо целогоwhere p.id_loai == ...