webabcd - 专注于asp.net, Silverlight

ASP.NET
从现在开始 一切都不晚
posts - 234, comments - 6378, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[索引页]
[源码下载]


步步为营VS 2008 + .NET 3.5(5) - LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法


作者:webabcd


介绍
    ·Select - Select选择;延迟
    ·Where - Where查询;延迟
    ·OrderBy - 按指定表达式对集合正序排序;延迟
    ·OrderByDescending - 按指定表达式对集合倒序排序;延迟
    ·GroupBy - 分组;延迟
    ·Join - Join查询;延迟
    ·GroupJoin - 分组Join查询;延迟
    ·以上查询操作符所对应的查询语法


示例
Summary.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;

using System.Collections.Generic;
using DAL;

public partial class LINQ_Summary : System.Web.UI.Page
{
    NorthwindDataContext _ctx 
= new NorthwindDataContext();
    
string[] _ary = null;

    
protected void Page_Load(object sender, EventArgs e)
    
{
        _ary 
= new string[] "asp.net""csharp""xhtml""css""javascript"
            
"wcf""wpf""silverlight""linq""wf"
            
"sqlserver""asp.net ajax""ssis""ssas""ssrs" }
;

        
// Select - Select选择;延迟
        Summary_Select();

        
// Where - Where查询;延迟
        Summary_Where();

        
// OrderBy - 按指定表达式对集合正序排序;延迟
        
// OrderByDescending - 按指定表达式对集合倒序排序;延迟
        Summary_OrderBy_OrderByDescending();

        
// GroupBy - 分组;延迟
        Summary_GroupBy();

        
// Join - Join查询;延迟
        Summary_Join();

        
// GroupJoin - 分组Join查询;延迟
        Summary_GroupJoin();
    }

}

Select - Select选择;延迟
    /// <summary>
    
/// Select - Select选择;延迟
    
/// </summary>

    void Summary_Select()
    
{
        
// 使用Select查询操作符
        var categories = _ctx.Categories.Select(
            c 
=> new { CategoryName = "类别名称:" + c.CategoryName });

        
foreach (var c in categories)
        
{
            result.InnerHtml 
+= c.CategoryName + "<br />";
        }

        result.InnerHtml 
+= "<br />";


        
// 与上面的Select查询操作符相对应的查询语法
        var categories2 = from c in _ctx.Categories
                          select 
new { CategoryName = "类别名称:" + c.CategoryName };

        
foreach (var c in categories2)
        
{
            result.InnerHtml 
+= c.CategoryName + "<br />";
        }

        result.InnerHtml 
+= "<br />";
    }
运行结果
类别名称:Beverages
类别名称:Condiments
类别名称:Confections
类别名称:Dairy Products
类别名称:Grains/Cereals
类别名称:Meat/Poultry
类别名称:Produce
类别名称:Seafood

Where - Where查询;延迟
    /// <summary>
    
/// Where - Where查询;延迟
    
/// </summary>

    void Summary_Where()
    
{
        
// 使用Where查询操作符
        var ary = _ary.Where(a => a.StartsWith("w"&& a.EndsWith("f"));

        
foreach (string s in ary)
        
{
            result.InnerHtml 
+= s + "<br />";
        }

        result.InnerHtml 
+= "<br />";


        
// 与上面的Where查询操作符相对应的查询语法
        var ary2 = from a in _ary
                   where a.StartsWith(
"w"&& a.EndsWith("f")
                   select a;

        
foreach (string s in ary2)
        
{
            result.InnerHtml 
+= s + "<br />";
        }

        result.InnerHtml 
+= "<br />";
    }
运行结果

wcf
wpf
wf

OrderBy - 按指定表达式对集合正序排序;延迟
OrderByDescending - 按指定表达式对集合倒序排序;延迟
    /// <summary>
    
/// OrderBy - 按指定表达式对集合正序排序;延迟
    
/// OrderByDescending - 按指定表达式对集合倒序排序;延迟
    
/// </summary>

    void Summary_OrderBy_OrderByDescending()
    
{
        
// 使用OrderBy查询操作符
        var ary = (from a in _ary
                   select a).OrderBy(a 
=> a.Length); // OrderByDescending与OrderBy用法相同

        
foreach (string s in ary)
        
{
            result.InnerHtml 
+= s + "<br />";
        }

        result.InnerHtml 
+= "<br />";


        
// 与上面的OrderBy查询操作符相对应的查询语法
        var ary2 = from a in _ary
                   orderby a.Length ascending 
// orderby xxx descending与orderby xxx ascending用法相同
                   select a;

        
foreach (string s in ary2)
        
{
            result.InnerHtml 
+= s + "<br />";
        }

        result.InnerHtml 
+= "<br />";
    }
运行结果
wf
css
wcf
wpf
linq
ssis
ssas
ssrs
xhtml
csharp
asp.net
sqlserver
javascript
silverlight
asp.net ajax

GroupBy - 分组;延迟
    /// <summary>
    
/// GroupBy - 分组;延迟
    
/// </summary>

    void Summary_GroupBy()
    
{
        
// 使用GroupBy查询操作符
        var list = (from a in _ary
                    select a).GroupBy(a 
=> a.Length).Select(
                        g 
=> new { Group = g.Key, Member = g });

        
foreach (var g in list)
        
{
            result.InnerHtml 
+= g.Group + "个字符:<br />";

            
foreach (string s in g.Member)
            
{
                result.InnerHtml 
+= "--" + s + "<br />";
            }

        }

        result.InnerHtml 
+= "<br />";


        
// 与上面的GroupBy查询操作符相对应的查询语法
        var list2 = from a in _ary
                    group a by a.Length into g
                    select 
new { Group = g.Key, Member = g };

        
foreach (var g in list2)
        
{
            result.InnerHtml 
+= g.Group + "个字符:<br />";

            
foreach (string s in g.Member)
            
{
                result.InnerHtml 
+= "--" + s + "<br />";
            }

        }

        result.InnerHtml 
+= "<br />";
    }
运行结果

7个字符:
--asp.net
6个字符:
--csharp
5个字符:
--xhtml
3个字符:
--css
--wcf
--wpf
10个字符:
--javascript
11个字符:
--silverlight
4个字符:
--linq
--ssis
--ssas
--ssrs
2个字符:
--wf
9个字符:
--sqlserver
12个字符:
--asp.net ajax

Join - Join查询;延迟
    /// <summary>
    
/// Join - Join查询;延迟
    
/// </summary>

    void Summary_Join()
    
{
        
// 使用Join查询操作符
        var products = _ctx.Products.Join(
            _ctx.Categories, 
            p 
=> p.CategoryID, 
            c 
=> c.CategoryID, 
            (p, c) 
=> new { c.CategoryName, p.ProductName }).Take(5);

        
foreach (var p in products)
        
{
            result.InnerHtml 
+= p.CategoryName + " - " + p.ProductName + "<br />";
        }

        result.InnerHtml 
+= "<br />";


        
// 与上面的Join查询操作符相对应的查询语法
        var products2 = (from p in _ctx.Products
                         join c 
in _ctx.Categories
                         on p.CategoryID equals c.CategoryID
                         select 
new { c.CategoryName, p.ProductName }).Take(5);

        
foreach (var p in products2)
        
{
            result.InnerHtml 
+= p.CategoryName + " - " + p.ProductName + "<br />";
        }

        result.InnerHtml 
+= "<br />";
    }
运行结果

Beverages - Chai
Beverages - Chang
Condiments - Aniseed Syrup
Condiments - Chef Anton's Cajun Seasoning
Condiments - Chef Anton's Gumbo Mix

GroupJoin - 分组Join查询;延迟
    /// <summary>
    
/// GroupJoin - 分组Join查询;延迟
    
/// </summary>

    void Summary_GroupJoin()
    
{
        
// 使用GroupJoin查询操作符
        var products = _ctx.Categories.GroupJoin(
            _ctx.Products, 
            c 
=> c.CategoryID, 
            p 
=> p.CategoryID, 
            (p, g) 
=> new { p.CategoryName, ProductCount = g.Count() });

        
foreach (var g in products)
        
{
            result.InnerHtml 
+= g.CategoryName + "" + g.ProductCount + "<br />";

        }

        result.InnerHtml 
+= "<br />";


        
// 与上面的GroupJoin查询操作符相对应的查询语法
        var products2 = from c in _ctx.Categories
                        join p 
in _ctx.Products on c.CategoryID equals p.CategoryID into g
                        select 
new { CategoryName = c.CategoryName, ProductCount = g.Count() };


        
foreach (var g in products2)
        
{
            result.InnerHtml 
+= g.CategoryName + "" + g.ProductCount + "<br />";

        }

        result.InnerHtml 
+= "<br />";
    }
运行结果

Beverages:12
Condiments:12
Confections:13
Dairy Products:10
Grains/Cereals:7
Meat/Poultry:6
Produce:5
Seafood:12



OK
[源码下载] 
0
0
(请您对文章做出评价)
« 上一篇:步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)
» 下一篇:步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefault、Reverse、SelectMany

Feedback

#1楼   回复  引用    

2007-10-15 08:53 by ivw[未注册用户]
支持。。。这个是08新加的吗?

#2楼[楼主]   回复  引用  查看    

2007-10-15 10:25 by webabcd      
@ivw
是的
这就是LINQ
有很多查询操作符
之后都会一一介绍一遍

#3楼   回复  引用    

2007-10-15 23:01 by 黑白[未注册用户]
支持
这东西太cool了

#4楼[楼主]   回复  引用  查看    

2007-10-16 08:26 by webabcd      
@黑白
:)
同感

#5楼   回复  引用    

2007-10-16 22:15 by 黑白[未注册用户]
麻烦兄弟能不能详细解释一下GroupJoin的意思

#6楼[楼主]   回复  引用  查看    

2007-10-17 07:48 by webabcd      
@黑白
就是先join,再group啊

#7楼   回复  引用    

2007-10-17 22:44 by 黑白[未注册用户]
我指的是这句
var products = _ctx.Categories.GroupJoin(_ctx.Products, c => c.CategoryID, p => p.CategoryID, (p, g) => new { p.CategoryName, ProductCount = g.Count() });
GroupJoin里的参数都是什么意思啊

#8楼[楼主]   回复  引用  查看    

2007-10-18 07:52 by webabcd      
@黑白
第一个参数:需要被join的表
第二个参数:本表需要关联的key
第三个参数:被join的表需要关联的key
第四个参数:分组表达式(其中第一个参数:本表的实体;第二个参数:被join的表集合)

#9楼   回复  引用  查看    

2008-08-19 10:59 by Terry Sun      
@webabcd
var products = _ctx.Categories.GroupJoin(_ctx.Products, c => c.CategoryID, p => p.CategoryID, (p, g) => new { p.CategoryName, ProductCount = g.Count() });
(p, g) 哪里来的g?, 怎么会有p.CategoryName?
应该是这样的
var products1 = this._ctx.Categories.GroupJoin(
this._ctx.Products,
c => c.CategoryID,
p => p.CategoryID,
(c, p) => new { c.CategoryName, ProductCount = p.Count() });

#10楼[楼主]   回复  引用  查看    

2008-08-19 17:22 by webabcd      
@Terry Sun
:)

var products = _ctx.Categories.GroupJoin(_ctx.Products, c => c.CategoryID, p => p.CategoryID, (p, g) => new { p.CategoryName, ProductCount = g.Count() });

前面的c,p和后面的p,g
其中的p并不是同一参数

也就是后面的(p, g)完全可以写成(x, y),或其他的

#11楼   回复  引用    

2008-12-09 09:15 by skyland84[未注册用户]
GroupJoin - 分组Join查询;延迟

// 与上面的GroupJoin查询操作符相对应的查询语法
var products2 = from c in _ctx.Categories
join p in _ctx.Products on c.CategoryID equals p.CategoryID into g
select new { CategoryName = c.CategoryName, ProductCount = g.Count() };

这里有点问题。
c.CategoryName 这个应该是P.CategoryName。
还是我理解错误了?

#12楼   回复  引用    

2008-12-09 09:21 by skyland84[未注册用户]
理解了。我误解了

// 与上面的GroupJoin查询操作符相对应的查询语法
var products2 = from c in _ctx.Categories
join p in _ctx.Products on c.CategoryID equals p.CategoryID into g
select new { CategoryName = c.CategoryName, ProductCount = g.Count() };


不过又有新问题。这里 我怎么看不出来哪里有分组了?
这里不是将两个表数据关联后丢给g 然后就是 创建匿名类型数据,那么g.Count()的数据不都是一样的吗?

#13楼[楼主]   回复  引用  查看    

2008-12-09 12:33 by webabcd      
@skyland84
这个就是对被Join的那个做分组
所以叫GroupJoin
如果只从他的语法上看,确实很难理解

#14楼   回复  引用    

2009-08-07 09:51 by moosdau[未注册用户]
请问用扩展方法如何left join? 查了很多地方也不见有说的.

#15楼[楼主]   回复  引用  查看    

2009-08-07 12:09 by webabcd      
@moosdau
来个例子吧

from d in data
join myReport in report
on d.OrderId equals myReport.OrderId into tmp
from r in tmp.DefaultIfEmpty()

#16楼   回复  引用    

2009-08-09 08:15 by moosdau[未注册用户]
@webabcd
谢谢回复, 可是我问的是用"扩展方法"如何left join, 就是函数式的语法.

#17楼[楼主]   回复  引用  查看    

2009-08-10 08:11 by webabcd      
@moosdau
嗯。。。
来个例子

Schedules.GroupJoin(Products, s=>s.ScheduleId, p=>p.ProductID, (s,g)=> new {s.ScheduleId, tmp = g.DefaultIfEmpty()}).Select(x => new {x.ScheduleId, x.tmp.First().Title})

#18楼   回复  引用  查看    

2009-08-10 10:21 by 木只八刀      
@webabcd
谢谢.
可是在Linq to Sql中这个语法产生的sql语句并不是期望的.
例如:
var rs = db.BasicJob.GroupJoin(
db.JobType,
p => p.JobTypeID,
p2 => p2.ID,
(p, p2) =>new
{
p.Name,
jt= p2.DefaultIfEmpty()
})
.Select(p=>new {
p.Name,
n2= p.jt.First().Name
})
.ToList();

产生的SQL语句是:

SELECT [t0].[Name], (
SELECT [t4].[Name]
FROM (
SELECT TOP (1) [t3].[Name]
FROM (
SELECT NULL AS [EMPTY]
) AS [t1]
LEFT OUTER JOIN (
SELECT [t2].[Name]
FROM [dbo].[JobType] AS [t2]
WHERE [t0].[JobTypeID] = [t2].[ID]
) AS [t3] ON 1=1
) AS [t4]
) AS [n2]
FROM [dbo].[BasicJob] AS [t0]

但是用from ...join...into 这样的语法产生的SQL语句是标准的LEFT JOIN .

#19楼[楼主]   回复  引用  查看    

2009-08-10 12:01 by webabcd      
@木只八刀
那就类似这样写

Schedules
.GroupJoin (
Products,
s => s.ScheduleId,
p => p.ProductID,
(s, g) =>
new
{
s = s,
g = g
}
)
.SelectMany (
temp0 => temp0.g.DefaultIfEmpty (),
(temp0, r) =>
new
{
ScheduleId = temp0.s.ScheduleId,
Title = r.Title
}
)

#20楼   回复  引用  查看    

2009-08-10 12:40 by 木只八刀      
@webabcd
谢谢!!

#21楼[楼主]   回复  引用  查看    

2009-08-10 18:10 by webabcd      
@木只八刀
:)
不谢