Помощь в Entity Framework 4.1 Query - PullRequest
0 голосов
/ 20 июня 2011

Мне нужна помощь в написании запроса, ниже я написал классы с необходимыми свойствами только для этого примера (я не показал таблицы БД, которые генерирует ef)

//this class will create a unique id for each location may be country,
 state or city
public  class Location
{
    public int Id { get; set; }
    public string Name { get; set; }       
    public string Discriminator{get;set;} 

    public int? ParentLocationId { get; set; }
    public Location ParentLocation { get; set; }

    public ICollection<Location> ChildLocations { get; set; }
}

Пример данных о местоположении

Id | Name | Discriminator | ParentLocationId
1 | India | Country | null
2 | Karnatka | State | 1
3 | Maharashtra | State | 1
4 | Banglore | City | 2


//this will contain all product categories + products itself
public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Category ParentCategory { get; set; }
    public int? ParentCategoryId { get; set; }

    public ICollection<Category> ChildCategories { get; set; }
}

Тип данных выборки

Id | Name | ParentCategoryId
1  | Electronics | Null
2  | Mobiles | 1
3 | Apple | 2
4 | Nokia | 2
5 | I phone-4 | 3
6 | Nokia-Some Model | 4

Я использовал переменную Type = User в следующем классе, но у меня естьЗдесь не указан класс 'User', так как он не содержит ничего. spl

public class Purchase
{
    public int Id { get; set; }

    public User User { get; set; }
    [Required]
    public int UserId { get; set; }

    public Category Category { get; set; }
    [Required]
    public int CategoryId { get; set; }

    public Location Location { get; set; }
    [Required]
    public int LocationId { get; set; }
}

Примечание для успешной покупки заказ locationId должен быть cityId и categoryIdдолжно быть наименьшим в иерархии, например, categoryId не может быть мобильным, это должен быть iphone-4 или nokia-some-model

Образец данных заказов на поставку

Id | CategoryId | LocationId | UserId
1  | 5 | 4  | 1 
1  | 5 | 4  | 2
1  | 5 | 4  | 3

До сих пор у меня все работало нормально, Ниже мой вопрос

Механизм создания создания Iam, в котором я предоставляю две вещи locationId (это местоположение может быть идентификатором страны,штат или город) и идентификатор продукта (этот продукт может быть любым в иерархии, например,это значение может быть идентификатором электроники или мобильного телефона, Apple или iPhone) и получить список всех покупок, которые удовлетворяют этому

, например: примеры фильтров, которые я могу сделать

  • a>найти все мобильные продажи в штате (указать категорию мобильного телефона и locationId определенного штата)
  • b> найти все продажи nokia в стране (указать категорию nokia и locationId определенной страны) и т. д..

Я открыт для любых предложений, также вы можете сообщить мне, если есть что-то, что не было должным образом объяснено в этом вопросе.

1 Ответ

1 голос
/ 20 июня 2011

Это иерархические запросы, которые IMHO невозможно эффективно выполнить в linq-to-entity, поскольку linq-to-entity не поддерживает рекурсию, необходимую для навигации по иерархии.

Эти запросы лучше всего работают с некоторой поддержкой из базы данных - в случае SQL Server 2005 и новее вы можете использовать CTE и иерархические запросы . CTE можно использовать в представлениях базы данных, которые, в свою очередь, могут быть сопоставлены с сущностью в EF, но все равно не позволят вам создать необходимые критерии фильтрации, поскольку представление может иметь только статическую структуру.

Например, вы можете использовать CTE для определения представления, возвращающего CityId и его CountryId в одной записи. Затем вы можете использовать это представление и присоединить его к покупкам и фильтровать по CountryId. Но что, если вам нужно искать по StateId? В вашем представлении в настоящее время не определен столбец StateId - вы можете добавить его в качестве другого столбца, но это только усложнит все - вам нужно будет знать, нужно ли фильтровать данные по стране или штату. Что делать, если у вас есть другой уровень? И еще один? Что если вы не можете сказать заранее, сколько у вас уровней? Это именно то, что может случиться с категориями. Вид вам не поможет.

Это было бы возможно, если бы в EF была поддержка функций с табличными значениями - вы бы создали функцию с табличными значениями для Locations (она будет динамически возвращать все города, принадлежащие переданному LocationId), используя внутреннюю CTE и аналогичную функцию для категорий и вы должны отобразить эти функции в EDMX и использовать их в соединениях в запросах linq-to-entity. Есть одна проблема - EF пока не поддерживает функции отображения таблиц - планируется следующий выпуск 1016 *.

Если вам нужен такой вид поиска, вам нужен простой старый SQL + CTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...