帮助实体框架4.1查询

时间:2011-06-19 21:57:58

标签: entity-framework entity-framework-4 entity-framework-4.1 entity-relationship

我在编写查询时需要帮助,下面我已经为这个例子编写了需要属性的类(我没有显示e.f.生成的DB表)

//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不能是Mobile,它应该是iphone-4 或nokia-some-model

样品采购订单数据

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

直到现在每件事情都适合我,以下是我的问题

Iam创建过滤机制,其中我提供2个locationId(此位置可能是国家,州或城市的ID)和产品ID(此产品可能是层次结构中的任何位置,例如此值可能是电子或移动设备或苹果或iPhone)并获得满足此

的所有购买清单

例如:我可以制作的样本过滤器

  • A&GT;查找某州的所有移动销售(通过类别移动和特定州的locationId)
  • B个找到一个国家的所有诺基亚销售(通过诺基亚的类别ID和特定国家的locationId) 等等..

我愿意接受任何建议,如果在这个问题中没有正确解释任何事情,你可以告诉我。

1 个答案:

答案 0 :(得分:1)

这是分层查询,它们在linq-to-entities中无法有效地执行,因为linq-to-entities不支持在层次结构中导航所需的递归。

这些查询最适合数据库的一些支持 - 在SQL Server 2005及更新的情况下,您可以使用CTE and hierarchical queries。 CTE可以在数据库视图中使用,而数据库视图又可以映射到EF中的实体,但它仍然不允许您创建所需的过滤条件,因为视图只能具有静态结构。

例如,您可以使用CTE在单个记录中定义返回CityId及其CountryId的视图。然后,您可以使用此视图并将其加入购买并按CountryId进行过滤。但是,如果您需要按StateId进行搜索,该怎么办?您的视图目前没有定义StateId列 - 您可以将其添加为另一列,但它只会使所有内容复杂化 - 您必须知道是否必须按国家/地区或州进行过滤。如果你有另一个级别怎么办?还有一个?如果你不能预先说出你有多少级别怎么办?这正是类别可能发生的情况。视图对你没有帮助。

这可能是可能的,如果EF支持表值函数 - 你将为内部创建一个表值函数(它将动态返回属于传递LocationId的所有城市),并在内部使用CTE和类似函数类别,您将在EDMX中映射这些函数,并在linq-to-entities查询中的连接中使用它们。有一个问题 - EF不支持映射表值函数 - 它计划用于next major release

如果您需要这种搜索,则需要使用普通的旧SQL + CTE。