Как мне заставить структуру сущностей искать, существуют ли связанные данные в связанной таблице?

Я работаю над тем, чтобы сделать проект инфраструктуры объектов более масштабируемым в соответствии с нашими требованиями. В проекте используются файл 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(),
           .
           .
           .
         };
}
Другие вопросы по тегам