• 如何实现Conditional Include


    本文转载:http://www.cnblogs.com/brusehht/archive/2010/09/01/1814962.html

    问题描述

    有些朋友希望使用这样的一种查询方式,比如要查询Movies实体对象,同时想通过预先加载方式加载相关的Reviews对象,但是又希望只加载符合条件的部分Reviews。

    很不幸的是,EF并不能满足这样的功能ObjectQuery<Movie>.Include(…)方法只能加载全部或者全部不加载。

     var dbquery=ctx.Movies.Include("Reviews").Where(g=>g.Genre == "Horror")

    解决方案

    下面的变通方法可以实现上面的要求:

    public class Movie
    {
        public int ID {get;set;}
        public string Name {get;set;}
        public string Genre {get;set;}
        public List<Review> Reviews {get;set;}
    }
    public class Review
    {
        public int ID {get;set;}
        public int Stars {get;set;} 
        public string Summary {get;set;}
        public Movie Movie {get;set;}
        public User User {get;set;}
    }

    假设你想要获取影片“Horror”所述的带有5颗星的Reviews,你可以像下面这样:

    var dbquery =
       from movie in ctx.Movies
       where movie.Genre == “Horror”
       select new {
          movie, 
          reviews = from review in movie.Reviews
                    where review.Stars == 5
                    select review
       };

    var movies = dbquery
       .AsEnumerable()
       .Select(m => m.movie);

    现在来看一下上面的代码为什么能够成功执行?

    首先第一个查询就创建了一个包含所有Horror影片及其包含5颗星的Reviews的新的实例。

    第二个查询利用LINQ to Object的AsEnumerable()方法进行了一次内存查询,简单的采用非拆包方式从匿名类型中得到了相关的实例,内每个Movie中将包含了经过过滤的Reviews。

    所以下面的代码断言都将通过,

    foreach(var movie in movies)
    {
        foreach(var review in movie.Reviews)
            Assert(review.Rating == 5);
    }

    上面的代码能够实现的原因是因为EF引入了一种叫做relationship fix-up的机制。

    relationship fix-up假设所有相关的对象将在第二种实体对象进入到ObectContext的时候被自动挂接,这里我们在讲对象装载入ObjectContext的时候只包含了相应的Movie和经过过滤的相关的Reviews,EF就默认为他们已经自动挂接了,那意味着那些被过滤的Reviews将自动填充Movie的Review数组。

    简而言之,这种Relationship fix-up方式(我这里叫他Relationship改进)将可以应用到你的高级应用中。

  • 相关阅读:
    Laravel 如何在blade文件中使用Vue组件
    历史上的今天mysql数据库包含详情分类以及图片
    【问题】多重继承时,super函数只初始化继承的第一个类,不初始化第二个类。
    pretty-errors:美化python异常输出以使其清晰易读
    python 安装pyinstaller
    python制作ico图标
    Unofficial Windows Binaries for Python Extension Packages
    【转载】wav文件格式分析与详解
    C语言结构体定义位域,从bit0开始,依次到最高bit位
    IP切换脚本
  • 原文地址:https://www.cnblogs.com/51net/p/4130192.html
Copyright © 2020-2023  润新知