我在编写查询时需要帮助,下面的只为这个示例编写了具有必要属性的类(我还没有向DB表显示e.f。生成)
//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‘类,因为它不包含任何东西
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或者诺基亚的一些型号。
样例采购订单数据
Id | CategoryId | LocationId | UserId
1 | 5 | 4 | 1
1 | 5 | 4 | 2
1 | 5 | 4 | 3到现在为止,每件事对我都很好,下面的是我的问题
我正在创建过滤机制,其中我提供了locationId(这个位置可能是国家、州或城市的ID )和产品id (此产品可能是层次结构中的任何位置,例如这个值可能是电子、移动、苹果或iphone的id),并获得满足此要求的所有采购列表。
例句:我可以制作样品过滤器。
我愿意接受任何建议,如果有什么问题没有得到适当解释的话,你也可以告诉我。
发布于 2011-06-19 22:44:11
这是分层查询,IMHO无法在linq到实体中有效执行,因为linq到实体不支持在层次结构中导航所需的递归。
如果使用Server 2005和更新版本,可以使用CTE和层次查询,这些查询最好使用数据库的一些支持。CTE可以在数据库视图中使用,而数据库视图又可以映射到EF中的实体,但它仍然不允许您创建所需的筛选条件,因为视图只能具有静态结构。
例如,可以使用CTE在单个记录中定义返回CityId及其CountryId的视图。然后,您可以使用此视图并通过CountryId将其加入到购买和筛选中。但是如果你需要通过StateId搜索呢?您的视图目前还没有定义StateId列--您可以将其添加为另一列,但这只会使一切复杂化--您将不得不知道是否必须按国家或州进行筛选。如果你有另一个水平呢?还有一个?如果你不能预先说出你有多少等级呢?这正是分类可能发生的情况。视图帮不了你。
如果EF支持表值函数--您将在内部使用CTE为位置创建一个表值函数(它将动态返回属于已传递的LocationId的所有城市),并对类别使用类似的函数,那么这可能是可能的,并且您将映射EDMX中的这些函数,并在linq到实体查询中使用这些函数。有一个问题- EF还不支持映射表值函数-它是为下一个主要发行版计划的。
如果需要这种搜索,则需要普通的旧SQL + CTE。
https://stackoverflow.com/questions/6405345
复制相似问题