Entity Framework 4.1 两个跟踪查询

Posted

技术标签:

【中文标题】Entity Framework 4.1 两个跟踪查询【英文标题】:Entity Framework 4.1 Two Tracked Queries 【发布时间】:2013-04-05 11:55:15 【问题描述】:

我正在学习 EF,如果其他地方已经回答了这个问题,我深表歉意。我找不到解决方案。我正在使用两个跟踪查询,因为我不能使用 Include,因为它不支持条件。所以我的代码如下:

    List<int> CategoryIDs = _categoryIDs.Split(',').Select(t => int.Parse(t)).ToList();

我的模特:

 public class Genre


    public int GenreID  get; set; 
    public string Name   get; set; 
    public string iconURL get; set; 
    public string Description  get; set; 
    public int DisplaySequence  get; set; 
    public IList<Category> Categories  get; set; 





   public class Category
   


    public int CategoryId  get; set; 
    public int GenreID  get; set; 
    public string CategoryName  get; set; 
    public virtual Genre Genre  get; set; 
   


     public class SubCategory
      


    public int SubCategoryID  get; set;      
    public int CategoryID  get; set; 
    public string SubCategoryName  get; set;   
    public virtual Category Category  get; set;  

然后我有我的视图模型:

public class HomeIndexData


    public IEnumerable<Genre> Genres  get; set; 
    public IEnumerable<Category> Categories  get; set; 
    public IEnumerable<SubCategory> SubCategories  get; set;          


然后我尝试将视图模型返回到我的索引:

     public ActionResult Index()
     

     var genres = db.Genres.ToList().OrderBy(g => g.DisplaySequence);
     var categories = db.Categories.Include(i => i.SubCategories)
                     .Where(i => CategoryIDs.Contains(i.CategoryId));
            foreach (var category in categories)
            

            ;

           HomeIndexData viewModel = new HomeIndexData
            
                Genres = genres                         

            ;
            return View(viewModel);      

        

它返回结果,但我也想过滤子类别。如何放置 WHERE 条件而不是 .Include(i => i.SubCategories)。

请注意我不想返回匿名类型,这就是为什么我是两个跟踪查询。

提前致谢。

【问题讨论】:

如果你分享你的模型,你会得到更多的关注。类别和子类别是否属于同一类型?换句话说,这是自引用表吗? 感谢您的回复。我也分享了我的模型。关于如何对子类别设置条件有什么想法吗? 您希望看到什么返回? 我期待看到流派、过滤的类别和过滤的子类别。我的代码已经过滤了类别。想对子类别做同样的事情 为什么不只是第三行var subCategories = db.SubCategories.Where("your SubCategory filter")... 【参考方案1】:

好吧,我想我知道你想在这里做什么:

// so filter out categories
var categories = db.Categories.Where(c => CategoryIDs.Contains(c.CategoryID)); 

// so filter out subcategories - I'm not sure what kind of filtering you want on subcategories
var subcategories = db.Subcategories.Where(s => CategoryIDs.Contains(s.SubCategoryID)); 
// so alternatively just do this: var subcategories = db.Subcategories.Where(s => s.DoYourFilteringForSubcategories);

foreach (var subcategory in subcategories)
    var cat = categories.SingleOrDefault(c => c.CategoryID == subcategory.CategoryID)
    if (cat != null)
    
        cat.Subcategories.Add(subcategory);
    
    else
    
        // very good question? what are you going to do with subcategories that
        //match your criteria, but its category does not meet category filter
    

您需要在模型中添加:

   public class Category
   
    public int CategoryId  get; set; 
    public int GenreID  get; set; 
    public string CategoryName  get; set; 
    public virtual Genre Genre  get; set; 
    **public virutal List<Subcategory> Subcategories get; set; **
   

因此,您最终只会得到与您的过滤器匹配的类别,并且只包含与过滤器匹配的子类别。所有强类型和跟踪。

【讨论】:

以上是关于Entity Framework 4.1 两个跟踪查询的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core中更改跟踪工作原理

Entity Framework 4.1 InverseProperty 属性和ForeignKey

Entity Framework Core 数据查询原理详解

Entity Framework 4.1 - 动态预加载

Entity Framework 4.1 Fluent API 属性

卸载 Entity Framework 4.1 六月 CTP