首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架4.1查询中的帮助

实体框架4.1查询中的帮助
EN

Stack Overflow用户
提问于 2011-06-19 21:57:58
回答 1查看 424关注 0票数 0

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

代码语言:javascript
复制
//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; }
}

样本位置数据

代码语言:javascript
复制
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; }
}

样本类别数据

代码语言:javascript
复制
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‘类,因为它不包含任何东西

代码语言:javascript
复制
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或者诺基亚的一些型号。

样例采购订单数据

代码语言:javascript
复制
Id | CategoryId | LocationId | UserId
1  | 5 | 4  | 1 
1  | 5 | 4  | 2
1  | 5 | 4  | 3

到现在为止,每件事对我都很好,下面的是我的问题

我正在创建过滤机制,其中我提供了locationId(这个位置可能是国家、州或城市的ID )和产品id (此产品可能是层次结构中的任何位置,例如这个值可能是电子、移动、苹果或iphone的id),并获得满足此要求的所有采购列表。

例句:我可以制作样品过滤器。

  • a>在一个州找到所有的移动销售(通过移动的categoryId和特定州的locationId )
  • b>在一个国家找到所有的诺基亚销售(通过诺基亚的categoryId和特定国家的locationId )等等。

我愿意接受任何建议,如果有什么问题没有得到适当解释的话,你也可以告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6405345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档