在上一篇文章中,我们介绍了LINQ的一些基本用法,这一篇我们来看下另一种更简洁更优雅的表达式,Lambda表达式,也可以叫做点标记方法。

相信大家在实际工作中都用到过这两种方式,下面我们还是用实例来看下两种表达式的一些基本用法。

首先还是创建一个C#控制台程序,准备测试数据,创建两个类,Product产品类和Category类别类,每个产品分配一个类别。

     public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
} public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public int CategoryID { get; set; }
public int Count { get; set; }
public string Description { get; set; }
}

接着创建一些Category类型和Product类型的测试数组列表。

             Category[] categories = new Category[]{
new Category{CategoryID=,CategoryName="TOYOTA"},
new Category{CategoryID=,CategoryName="BMW"},
new Category{CategoryID=,CategoryName="BENZ"},
new Category{CategoryID=,CategoryName="HONDA"},
new Category{CategoryID=,CategoryName="LEXUS"}
}; Product[] products = new Product[]{
new Product{ProductID=,ProductName="Car1",CategoryID=,Count=,Description="TOYOTA Car"},
new Product{ProductID=,ProductName="Car2",CategoryID=,Count=,Description="TOYOTA SUV"},
new Product{ProductID=,ProductName="Car3",CategoryID=,Count=,Description="BMW Car"},
new Product{ProductID=,ProductName="Car4",CategoryID=,Count=,Description="BMW SUV"},
new Product{ProductID=,ProductName="Car5",CategoryID=,Count=,Description="BENZ Car"},
new Product{ProductID=,ProductName="Car6",CategoryID=,Count=,Description="HONDA Car"},
new Product{ProductID=,ProductName="Car7",CategoryID=,Count=,Description="LEXUS Car"},
new Product{ProductID=,ProductName="Car8",CategoryID=,Count=,Description="LEXUS SUV"}
};

1.查询产品列表中所有记录的ProductName,Count,Description列。(select)

             // LINQ
var productQuery1 = from p in products
select new
{
p.ProductName,
p.Count,
p.Description
}; Console.WriteLine("LINQ---");
foreach(var item in productQuery1)
{
Console.WriteLine("Product Name: {0} , Count: {1} , Description: {2}", item.ProductName, item.Count, item.Description);
} // LAMBDA
var productQuery2 = products.Select(p => new
{
ProductName = p.ProductName,
Count = p.Count,
Description = p.Description
}); Console.WriteLine("LAMBDA---");
foreach (var item in productQuery2)
{
Console.WriteLine("Product Name: {0} , Count: {1} , Description: {2}", item.ProductName, item.Count, item.Description);
}

2.查询产品列表中Count大于5的记录。(where)

             // LINQ
var productQuery1 = from p in products
where p.Count >
select p; Console.WriteLine("LINQ---");
foreach (var item in productQuery1)
{
Console.WriteLine(item.ProductName);
} // LAMBDA
var productQuery2 = products.Where(P => P.Count > ); Console.WriteLine("LAMBDA---");
foreach (var item in productQuery2)
{
Console.WriteLine(item.ProductName);
}

3.查找产品列表中类别为TOYOTA,BENZ,LEXUS的记录。(where / contains)

             // LINQ
var productQuery1 = from p in products
where (new int[] { ,,}).Contains(p.CategoryID)
select p; Console.WriteLine("LINQ---");
foreach (var item in productQuery1)
{
Console.WriteLine("Product Name: {0} , Category ID: {1} , Description: {2}", item.ProductName, item.CategoryID, item.Description);
} // LAMBDA
var productQuery2 = products.Where(p => new int[] { , , }.Contains(p.CategoryID)); Console.WriteLine("LAMBDA---");
foreach (var item in productQuery2)
{
Console.WriteLine("Product Name: {0} , Category ID: {1} , Description: {2}", item.ProductName, item.CategoryID, item.Description);
}

4.查找产品列表中类别为TOYOTA,LEXUS的记录,并且结果按产品数量Count降序排列。(where / orderby)

             // LINQ
var productQuery1 = from p in products
where p.CategoryID== || p.CategoryID==
orderby p.Count descending
select p; Console.WriteLine("LINQ---");
foreach (var item in productQuery1)
{
Console.WriteLine("Product Name: {0} , Category ID: {1} , Count: {2} , Description: {3}", item.ProductName, item.CategoryID, item.Count,item.Description);
} // LAMBDA
var productQuery2 = products.Where(p => (p.CategoryID == || p.CategoryID == )).OrderByDescending(p => p.Count); Console.WriteLine("LAMBDA---");
foreach (var item in productQuery2)
{
Console.WriteLine("Product Name: {0} , Category ID: {1} , Count: {2} , Description: {3}", item.ProductName, item.CategoryID, item.Count, item.Description);
}

5.产品列表和类别列表联合查询。(join)

             // LINQ
var productJoinCategoryQuery1 = from p in products
join c in categories
on p.CategoryID equals c.CategoryID
select new { p, c }; Console.WriteLine("LINQ---");
foreach (var item in productJoinCategoryQuery1)
{
Console.WriteLine("Product Name: {0} , Category Name: {1} , Count: {2} , Description: {3}", item.p.ProductName, item.c.CategoryName, item.p.Count, item.p.Description);
} // LAMBDA
var productJoinCategoryQuery2 = products.Join(categories,
p => p.CategoryID,
c => c.CategoryID,
(p, c) => new { p, c }); Console.WriteLine("LAMBDA---");
foreach (var item in productJoinCategoryQuery2)
{
Console.WriteLine("Product Name: {0} , Category Name: {1} , Count: {2} , Description: {3}", item.p.ProductName, item.c.CategoryName, item.p.Count, item.p.Description);
}

6.产品列表和类别列表分组联合查询。(join & group)

             // LINQ
var productByCategoryResult1 = from c in categories
join p in products
on c.CategoryID equals p.CategoryID
into CategoryProducts
select new
{
c.CategoryName,
Products = CategoryProducts
}; Console.WriteLine("LINQ---");
foreach (var item in productByCategoryResult1)
{
Console.WriteLine("Category: {0}", item.CategoryName);
foreach (var product in item.Products)
{
Console.WriteLine("{0} ({1})", product.ProductName, product.Description);
}
Console.WriteLine();
} // LAMBDA
var productByCategoryResult2 = categories.GroupJoin(products,
c => c.CategoryID,
p => p.CategoryID,
(c, p) => new { c.CategoryName, Products = p }); Console.WriteLine("LAMBDA---");
foreach (var item in productByCategoryResult2)
{
Console.WriteLine("Category: {0}", item.CategoryName);
foreach (var product in item.Products)
{
Console.WriteLine("{0} ({1})", product.ProductName, product.Description);
}
Console.WriteLine();
}

7.LAMBDA的一些其他用法。

             // LAMBDA 一些其他常用方法

             // Min
var productQueryMin = products.Min(p => p.Count);
Console.WriteLine("Count Min: {0}", productQueryMin); // Max
var productQueryMax = products.Max(p => p.Count);
Console.WriteLine("Count Max: {0}", productQueryMax); // Average
var productQueryAverage = products.Average(p => p.Count);
Console.WriteLine("Count Average: {0}", productQueryAverage); // Sum
var productQuerySum= products.Sum(p => p.Count);
Console.WriteLine("Count Sum: {0}", productQuerySum); // Skip / Take
var productQueryPage = products.Skip().Take().Select(p => new { p.ProductName, p.Count, p.Description });
foreach (var item in productQueryPage)
{
Console.WriteLine("Product Name: {0} , Count: {1} , Description: {2}", item.ProductName, item.Count, item.Description);
} // First (返回第一条记录,如果没有记录,则抛出异常)
var firstProduct = products.First(); // 此处查询的记录不存在,所以这行代码会抛出异常
var firstProductNull = products.Where(p => p.Count > ).First(); // FirstOrDefault (返回第一条记录,如果没有,则返回null)
var firstOrDefaultProduct = products.FirstOrDefault(); // 此处查询的记录不存在,所以这行代码返回null
var firstOrDefaultProductNull = products.Where(p => p.Count > ).FirstOrDefault(); // Single (返回集合中唯一的记录,如果大于或小于一条记录,则抛出异常,这行代码执行记录大于一条,所以会抛出异常)
var singleProduct = products.Single(); // 这行代码执行记录小于一条记录,所以也会抛出异常
var singleProductNull = products.Where(p => p.Count > ).SingleOrDefault();

好了,本篇就先到此,希望对你有所帮助,谢谢!

LINQ查询表达式和LAMBDA点标记方法基础的更多相关文章

  1. C# LINQ查询表达式用法对应Lambda表达式

    C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美 ...

  2. LINQ查询表达式详解(2)——查询表达式的转换

    简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...

  3. [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式

    最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果 ...

  4. Linq专题之创建Linq查询表达式

    本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据 ...

  5. 2.3 LINQ查询表达式中 使用select子句 指定目标数据

    本篇讲解LINQ查询的三种形式: 查询对象 自定义查询对象某个属性 查询匿名类型结果 [1.查询结果返回集合元素] 在LINQ查询中,select子句和from子句都是必备子句.LINQ查询表达式必须 ...

  6. LINQ查询表达式(1) - 查询表达式基础

    LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...

  7. LINQ查询表达式---------let子句

    LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class P ...

  8. LINQ查询表达式---------join子句

    LINQ查询表达式---------join子句 join 子句接受两个源序列作为输入. 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性. join子句使用 ...

  9. LINQ查询表达式---------orderby子句

    LINQ查询表达式---------orderby子句 LINQ可以按元素的一个或多个属性对元素进行排序. class Program { public class PerInfo { public ...

随机推荐

  1. 对AD域进行定期自动备份设置图解

    今天为大家讲解一下,如何对域进行定期的备份,因为如果域出问题了,在公司里那可就不好玩了啊,对做定期备份,在域出问题的时候可以及时恢复,减少对域重建而浪费大量的时间,同样也耽误公司员工的工作,这样的事情 ...

  2. IOS开发者证书申请及应用上线发布详解(2014版)

    其实一直以来我都想做一个最齐全的上传应用到appstore的教程,但一直狠不下心,今天凌晨2点12分,我鼓起勇气写教程,来吧不多说.登录开发者中心:http://developer.apple.com ...

  3. UVa 10176 - Ocean Deep ! - Make it shallow !!

    题目大意:判断一个很大的二进制能否被131071整除.在二进制转十进制的过程中不断取模,最后判断结果是否是0就可以了. #include <cstdio> #include <cst ...

  4. android TextView实现滚动显示效果

    在android中,如果设置了TextView控件为单行显示,且显示的文本太长的话,默认情况下会造成显示不全的情况,这种情况下我们需要设置该控件属性如下: <TextView android:i ...

  5. zabbix3.0.4 部署History

    [root@zabbix-Test ~]# history     1  passwd root    2  exit    3  yum  install ntpd*    4  yum  inst ...

  6. sklearn数据预处理-scale

    对数据按列属性进行scale处理后,每列的数据均值变成0,标准差变为1.可通过下面的例子加深理解: from sklearn import preprocessing import numpy as ...

  7. vim列编辑

    命令模式下:ctrl + v(我在gvim,win7中是ctrl +shift + q)进入列编辑模,选中要编辑的行(j 上,k下) 输入 “I” (大写的 I,光标定位到选中的第一行),输入要编辑的 ...

  8. endnote X7 加入文献

    endnote可以管理文献,并且在word中方便的添加参考文献. 1.加入文献: 2.导入以后可以创建自己的group,然后把导入的参考文献拖到group里,这样方便在插入参考文献的时候用group名 ...

  9. ViewFlipper的功能与用法

    ViewFlipper组件继承了ViewAnimator,它可调用addView(View v)添加多个组件,一旦向ViewFlipper中添加了多个组件之后,ViewFlipper可使用动画控制多个 ...

  10. js判断MAC地址

    function white_mac_FormCheck(mac)    {           var temp = /[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0- ...