Как мне заставить структуру сущностей искать, существуют ли связанные данные в связанной таблице?
Я работаю над тем, чтобы сделать проект инфраструктуры объектов более масштабируемым в соответствии с нашими требованиями. В проекте используются файл EDMX, Entity Framework и.NET 4.0. В проекте глобально настроена ленивая загрузка.
В основном у меня есть 2 таблицы:
Product
ProductId
ProductVariant
ProductVariantId
ProductId
У меня есть ситуация, когда в ProductVariant для данного продукта будут сотни тысяч связанных строк. Поэтому я хотел бы удалить свойство навигации для ProductVariant и сделать запрос для поиска только наиболее важных данных, а не всех связанных данных.
Тем не менее, большая часть кода делает что-то вроде:
if (Product.HasVariants) { [Loop Through Variants And Do Something] }
Который я поменяю на:
if (Product.HasVariants) { [Lookup Subset of Variants from DB And Do Something] }
HasVariants - это метод, который в настоящее время выглядит следующим образом:
public bool HasVariants()
{
return this.Variants.Count > 0;
}
Варианты - это свойство навигации. Я хотел бы создать запрос поиска с полем, указывающим, существуют ли какие-либо связанные данные в таблице вариантов, а не вызывать базу данных каждый раз, когда код выполняет эту проверку.
Вот как я мог бы сделать это в хранимой процедуре:
CREATE Procedure GetProduct
@ProductId
AS
Declare @HasVariants bit
Set @HasVariants = EXISTS(Select ProductVariantId
From ProductVariant
Where ProductId = @ProductId)
SELECT ProductId, <Other Fields>, @HasVariants AS HasVariants
FROM Product
WHERE ProductID = @ProductID
Return
Обратите внимание на наличие поля HasVariants, которое я бы использовал в методе HasVariants вместо коллекции.
У меня вопрос, как мне сделать то же самое (поле поиска из связанной таблицы), используя модель на основе EDMX? Я хочу сделать это без использования операторов SQL в коде, но если решение включает превращение HasVariants в свойство навигации (возможно?), Это приемлемо. Я уже понимаю, как написать запрос для выполнения по требованию, и мне нужен способ заставить структуру сущностей кэшировать свойство HasVariants так же, как и для остальных данных продукта.
Прости меня, если я не предоставил достаточно информации. Я новичок в Entity Framework, и я действительно не уверен, что нужно, чтобы ответить на этот вопрос.
1 ответ
Если вы хотите продублировать хранимую процедуру, вам нужно создать новый класс и реализовать что-то вроде этого:
public IQueryable<ProductWithHasVariant> GetProduct(DBContext context, int productId)
{
return from p in context.Products
where p.ProductId == productId
select new ProductWithHasVariant
{
p.ProductId,
HasVariants = p.Variants.Any(),
.
.
.
};
}