§ ITPOW >> 文档 >> C#

LINQ to SQL 学习笔记-查询(2)

作者:vkvi 来源:ITPOW(原创) 日期:2012-4-27

join 及一对多聚合

Sites 和 Topics 是一对多的关系,即 Sites 的某个 SiteId 在 Topics 中可能关联一条记录,也可能是多条,也可能没有。

如上代码,看似简单,实际包含了很多玄机。

  • into 相当于形成一个新的变量,但是这只是用法上来说,实际上是实现一对多的特殊效果,如果不要 into,那么上面的语句相当于 Sites 和 Topics 的 inner join 连接,如果某个 SiteId 在 Topics 中找不到,则该 Site 不会被选择出来,如果有多个,则会选择多个。有了 into 就不一样了,每一个 Site 都会被选择出来,每一个 Site 还会对应一个 topics,其对应的 topics 是 0 到多条与 SiteId 关联的 Topic。这种效果是什么呢?这种效果就好比对象数据库了,一个 Site 对应一个 List<Topic>。
  • 计算 TopicCount 需要条件。我们没有像 SQL 那种思路放在 where 中,而是直接放在 Count 方法中。因为 t 已经 into 为 topics,在 where 中实现难以操作。
  • 最后排序,起初我试图写 where (_orderby.SelectedValue == "quantity" ? topics.Count() : s.SiteKey) descending,但是由于二者一个是数字类型,一个是字符串类型,? : 不认这样的做法。所以干脆放到后面。

join 多列(多条件)

前面讲的 join 都只有一个条件,要使用 and、&& 实现多个条件会发现要报错。解决办法有多个。

简单的如果是多个等于条件,可用 new:

如果是更复杂的,比如之前示例中的 CreatedOn 并没有与另外一个表关联,并且它是 >= 这种,像这种可以放在 where 或其他地方。

orderby

orderby 没什么要说的,很 SQL 很相像,只是 orderby 的写法不是 order by。

orderby 多列

orderby 子句中可以直接像 SQL 一样写多个字段,逗号隔开,没有什么特别说明的,这里只是说,如果不是说 orderby 语句,而是用 OrderBy、ThenBy 方法要注意的。要注意的就是:OrderBy 多个连用时,是后面的优先级高。

t.OrderBy(i=>i.TopicId).OrderBy(i=>i.ColumnId) 等效 SQL order by ColumnId, TopicId。

t.OrderBy(i=>i.TopicId).ThenBy(i=>i.ColumnId) 等效 SQL order by TopicId, ColumnId

还有带 OrderByDescending、ThenByDescending,用法一样,只是表示降序。

group by

要注意,group by 不像 orderby 一样合在一起,而是中间还有个空格。并且 group by 的内容要 into。

group by 多列

多列怎么写呢?跟前面说的一样,用 new 对象:

参考资料


相关文章