我在编写查询时需要帮助,下面我已经为这个例子编写了需要属性的类(我没有显示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)并获得满足此
的所有购买清单例如:我可以制作的样本过滤器
我愿意接受任何建议,如果在这个问题中没有正确解释任何事情,你可以告诉我。
答案 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。