《深入理解c#》第十一章中LINQ查询表达式总结

《深入理解c#》第十一章介绍了查询表达式的基本语法以及Linq to SQL中各种常见操作。虽然我有一定的SQL基础,但初次接触查询表达式还是难免容易有遗忘、混淆,这里把书中这一章出现过的查询表达式在这里整理一下:

# 11.2.1

var query = from user in SampleData.AllUser select user;
# equals to:
query = SampleData.AllUser.select(user=> user);

# 11.2.3
IEnumerable<string> query = from user in SampleData.AllUser 
                            select user.Name;
# Select扩展方法签名:
static IEnumerable<TResult> Select<TSource, TResult>
    (this IEnumerable<TSource> source, 
     Func<TSource, TResult> selector);


# 11.2.4

ArrayList list = new ArrayList{"First", "Second", "Third"};
var string = from string entry in list
             select entry.Substring(0, 3);
#equals to:
list.Cast<string>().Select(entry=>entry.Substring(0, 3));

# 11.3
# 11.3.1

User tim = SampleData.Users.TesterTim;
var query = from defect in SampleData.AllDefects
            where defect.Status != Status.Closed
            where defect.AssignedTo == tim
            select defect.Summary;
# equals to:
SampleData.AllDefects.Where(defect=> defect.Status!=Status.Closed)
                     .Where(defect=> defect.AssignedTo==tim)
                     .Select(defect=> defect.Summary);


# 11.3.2

from defect in SampleData.AllDefects select defect;
# equals to:
SampleData.AllDefects.Select(defect=>defect);


from defect in SampleData.AllDefects 
        where defect.Status != Status.Closed
        where defect.AssignedTo == SampleData.Users.TesterTim
        select defect;
# equals to:
SampleData.AllDefects.Where(defect=>defect.Status!=Status.Closed)
                     .Where(defect=>defect.AssignedTo == SampleData.User.TesterTim);

# 注意以上三组(包括11.3.1中的例子)查询表达式与对应的转换代码的区别


User tim = SampleData.Users.TesterTim;
var query = from defect in SampleData.AllDefects
            where defect.Status != Status.Closed
            where defect.AssignedTo == tim
            orderby defect.Serverity descending
            select defect;

        
query = from defect in SampleData.AllDefects
        where defect.Status != Status.Closed
        where defect.AssignedTo == tim
        orderby defect.Serverity descending, defect.LastModified
        select defect;
# equals to:
SampleData.AllDefects.Where(defect=>defect.Status!=Status.Closed)
                     .Where(defect=>defect.AssignedTo == tim)
                     .OrderByDescending(defect=>defect.Serverity)
                     .ThenBy(defect=>defect.LastModified);


# 11.4
var query = from user in SampleData.AllUser
            orderby user.Name.Length
            select.user.Name;
foreach (var name in query)
{
    Console.WriteLine("{0}: {1}", name.Length, name);
}
# 更优写法:
var query2 = from user in SampleData.AllUser
             let length = user.Name.Length
             orderby length
             select new {Name = user.Name, Length=length};
foreach(var entry in query2)
{
    Console.WriteLine("{0}: {1}", entry.Length, entry.Name);
}            
# equals to:
var query2 = SampleData.AllUser
             .Select(user=>new {user, length=user.Name.Length})
             .Orderby(z=>z.length)
             .Select(z=>new{Name=z.Name, Length=z.length});

# 11.5
# 11.5.1
var query = from defect in SampleData.AllDefects
            join subscription in SampleData.AllSubscriptions
                on defect.Project equals subscription.Project
            select new {defect.Summary, subscription.EmailAddress};

query = from defect in SampleData.AllDefects
        where defect.Status == Status.Closed
        join subscription in SampleData.AllSubscriptions
            on defect.Project equals subscription.Project
        select new {defect.Summary, subscription.EmailAddress};
# equals to
query = from subscription in SampleData.AllSubscriptions
        joint defect in (from defect in SampleData.AllDefects
                         where defect.Status == Status.Closed
                         select defect)
            on defect.Project equals subscription.Project
        select new {defect.Summary, subscription.EmailAddress};

# LINQ to Object中Join方法重载之一的签名:
static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(
    this IEnumerable<TOuter> outer,
    IEnumerable<TInner> inner,
    Func<TOuter, TKey> outerKeySelector,
    Func<TInner, TKey> innerKeySelector,
    Func<TOuter, TInner, TResult> resultSelector
);

# 11.5.2
var query from defect in SampleData.AllDefects
    join subscription in SampleData.AllSubscriptions
        on defect.Project equals subscription.Project
        into groupedSubscriptions
    select new{Defect=defect, 
               Subscriptions=groupedSubscriptions};

var dates = new DateTimeRange(SampleData.Start, SampleData.End);
var query = from date in dates 
            join defect in SampleData.AllDefects
                on date equals defect.Created.Date
                into joined
            select new {Date=date, Count=joined.Count()};

# GroupJoin方法签名:
static IEnumerable<TResult> GroupJoin<Touter, TInner, TKey, TResult>(
    this IEnumerable<TOuter> outer,
    IEnumerable<TInner> inner,
    Func<TOuter, TKey> outerKeySelector,
    Func<TInner, TKey> innerKeySelector,
    Func<TOuter, IEnumerable<TInner>, TResult> resultSelector
);


# 11.5.3
var query = from user in SampleData.AllUser
            from project in SampleData.AllProjects
            select new {User=user, Project=project};

query = from left in Enumerable.Range(1, 4)
        from right in Enumerable.Range(11, left)
        select new {Left=left, Right=right};
# equals to:
query = Enumerable.Range(1,4)
                  .SelectMany(left=>Enumerable.Range(11, left),
                              (left, right)=>new{Left=left, Right=right});


query = from file in Dictionary.GetFiles(logDirectory, "*.log")
        from line in ReadLines(file)
        let entry =new LogEntry(line)
        where entry.Type==EntryType.Error
        select entry;

# 11.6
# 11.6.1
var query = from defect in SampleData.AllDefects
            where defect.AssignedTo != null
            group defect by  defect.AssignedTo;
foreach(var entry in query)
{
    Console.WriteLine(entry.Key.Name);
    foreach(var defect in entry)
    {
        Console.WriteLine("  ({0}) {1}", defect.Serverity, defect.Summary);
    }
}

query = from defect in SampleData.AllDefects
        where defect.AssignedTo != null
        group defect.Summary by defect.AssignedTo;
foreach(var entry in query)
{
    Console.WriteLine(entry.Key.Name);
    foreach(var summary in entry)
    {
        Console.WriteLine(" {0}", Summary);
    }
    Console.WriteLine();
}
# equals to 
SampleData.AllDefects.Where(defect=>defect.AssignedTo !=null)
                     .GroupBy(defect=>defect.AssignedTo, defect=>defect.Summary);


# 11.6.2
var query = from defect in SampleData.AllDefects
            where defect.AssignedTo != null
            group defect by defect.AssignedTo into grouped
            select new {Assignee=grouped.Key, Count=grouped.Count()};
# equals to:
var query = from grouped in (from defect in SampleData.AllDefects
                             where defect.AssignedTo != null
                             group defect by defect.AssignedTo)
            select new {Assignee=grouped.Key, Count=grouped.Count()};
# equals to:
var query = SampleData.AllDefects
                      .Where(defect=> defect.AssignedTo!=null)
                      .GroupBy(defect=>defect.AssignedTo)
                      .Select(grouped=>new{Assignee=grouped.Key, Count=grouped.Count()});


query = from defect in SampleData.AllDefects
        where defect.AssignedTo!=null
        group defect by defect.AssignedTo into grouped
        select new{ Assignee=grouped.Key,
                    Count=grouped.Count()} into result
        orderby result.Count descending
        select result;
# equals  to:
query = SampleData.AllDefects
                  .Where(defect=>defect.AssignedTo!=null)
                  .GroupBy(defect=>defect.AssignedTo)
                  .select(grouped=>new{Assignee=grouped.Key, Count=grouped.Count()})
                  .OrderByDescending(result=>result.Count);


# 11.7
# 11.7.1

var adultNames = (from person in people
                  where person.Age>=18
                  select person.Name).ToList();
# equals to:
var adultNames = people.Where(person=>person.Age>=18).Select(person=>person.Name).ToList();


from defect in SampleData.AllDefects
join subscription in SampleData.AllSubscriptions
    on defect.Project equals subscription.Project
select new {defect.Summary, subscription.EmailAddress};
# equals to
SampleData.AllDefects.Join(SampleData.AllSubscriptions,
    defect=>defect.Project, 
    subscription=>subscription.Project,
    (defect, subscription)=>new {defect.Summary, subscription.EmailAddress});


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Visual C#+SQL Server数据库开发与实例光盘第十一章节 本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种技术,最后一章总结性地介绍了数据库应用程序的性能优化和安全提高。本书适用于使用Visual C#开发Windows应用程序和Web应用程序的技术人员及编程爱好者,同时也是数据库开发人员的优秀参考书。   .NET平台是Microsoft公司推出的一套开发框架和工具,是软件开发领域非常重要的里程碑。而C#语言是一种功能强大、语法简单、面向对象和类型安全的编程语言,使用Visual C#开发数据库应用程序简单、快捷。SQL Server是一个用于各种信息管理系统、Web应用程序开发的最常用的后台数据库。   本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种技术,最后一章总结性地介绍了数据库应用程序的性能优化和安全提高。   本书适用于使用Visual C#开发Windows应用程序和Web应用程序的技术人员及编程爱好者,同时也是数据库开发人员的优秀参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值