20130916 似曾相识新挑战

  扯点有用的

  前面的日记里曾经提到,如果考官问我LINQ中左连接怎么写,我一定背不下来,而且我从来也没理解这种写法真正的意思。今天我大概其理解了。

  

var result = 
    from c in Categories
    join p in Products
    on c.CategoryID equals p.CategoryID
    into temp
    from t in temp.DefaultIfEmpty()
    select {...}

  这是一个典型的LINQ左连接代码,Category代表类别,Product代表产品,要解析这种常见的左连接linq语句,先看下面这个

var result = 
    from c in Categories
    from p in c.Products
    select {...}

  我想很少有人在实际操作中会这么写,这个结果相当于两个表Inner Join,当然,顺序要搞清楚...我没试过颠倒顺序后结果会如何。

var result = 
    from c in Categories
    join p in Products
    on c.CategoryID equals p.CategoryID
    select {...}

  上面这段是你熟悉的写法,也是一个内连接。

var result = 
    from c in Categories
    join p in Products
    on c.CategoryID equals p.CategoryID
    into temp
    select {
      CategoryName = c.CategoryName,
      Products = temp  
    }

  这种写法你可能很少见到,看起来和左连接已经非常相近了。如果你循环这个result,并且在循环中再循环result.Products就明白,这类似是一个分组,将join操作Products的结果存在temp中。如果没有连接结果,temp会是一个空集合。

  现在返回头思考两个from的情况。from后面的东西被称作数据源。即使是复杂的SQL,两个表连接无论采用了迭代还是哈希,其逻辑意义都是循环,可以理解为嵌套的两层foreach语句。但内连接相当于外部数据源(Category)如果找不到内部数据源(Products),则不将其加入到结果集中。按照这种思路我们来看上面的代码,你可以想象成这样: 首先 from OuterSource,一个foreach语句,循环的是每一条OuterSource的记录。之后Join InnnerSource,代表着搜罗所有拥有自己外键连接的(这里为了表达清楚就用SQL术语了)InnerSource记录,并且将其暂存在temp中。

  那左连接就好解释了,暂存的temp,其实就是能和自己进行连接的所有Product数据。在Categories 这个大循环中,先找出能和当前Category item连接的Temp Products,然后利用from语句,再循环所有这些Temp Products,如果temp没有数据,利用DefaultIfEmpty()方法创建一个相当于 default (Products) 的数据,也要和外部的Category Item进行连接。这和两个from的情况很类似,只是保证了每一个外部数据源记录都能找到至少一个内部数据源记录左连接,以避免这条外部数据源记录加不进最后结果集的情况。

  这下我能记住了。

 

  扯点没用的

  之所以写这个是因为刚才又抱起来了一本买了很久的LINQ书,刚看到基础讲解(当然上面是我自己理解的,书里没这样写...)。又翻LINQ书是因为看EF时候发现自己LINQ基础也不咋地,还是补补吧,而且书里都有LINQ TO ENTITIES的部分,也是EF的基础,正愁没地方找去呢。所以打算用一俩星期的时间把这本老书挑着看一下。

  有时候觉得可笑。Conductor的架构用了快三年了,到处是LINQ,愣是没什么进步,是该反省反省了,都干嘛了?不能因为工作忙就不深入研究了。这3年开发中还是积攒了好多疑惑的,没有过多去考虑,现在可以恶补回来,飞跃性的提高一下。

  我觉得最近意识改变了。看书看文章有点魔障,生活里没其他事情了。那天蹲厕所,拿着手机看知乎,才发现一星期只看了星期一的。现在我的个人自由时间,主要就是学习,然后消除联盟玩几把。每天把刷博客园当看新闻一样——这可是我之前一直梦寐以求的,觉得只要养成了就离成功不远的生活习惯...我一直对人说,要把看技术文章变成看报纸一样的一种习惯,态度。希望这种状态能保持久一点,不仅仅是因为夏天才这样。

  王师傅跟我说可能下星期要借调到另外一个项目组。我一听立即兴奋起来。这个组以前是一个人维护的,现在有4个人,一个UI Redsign的项目,做的可能(仅仅是可能)是MVC的。机会来了,进一个新项目组,把自己的技术和热情发挥出来,改变现在的沉闷,把自己准备很久的东西展现出来。

  这让我想起来了当初在赛乐最后一段时光,项目不紧张,时常自己研究。虽然和LINQ一点关系也没有,也找一些文章研究,一直研究到Expression Tree,甚至还想自己弄自己的LINQ TO XXX,后来进了现在的公司,发现这个架构正是基于LINQ的,虽然之前没真正实践过,但毕竟经过一段努力的学习,几乎不吃力的就适应了,巧合的是这两本LINQ的书正是那时候买的。

  学习,生生不息!

原文地址:https://www.cnblogs.com/apodemakeles/p/3325366.html