首先我们创建2个类,一个Category,一个Product
public class Product
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public string Name
{ get; set; }
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public int CategoryID
{ get; set; }
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
public class Category
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public string Name
{ get; set; }
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public int ID
{ get; set; }
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
然后创建2个List的数据源
static List<Category> categories = new List<Category>()
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Category()
{Name="Beverages", ID=001},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Category()
{Name="Condiments", ID=002},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Category()
{Name="Vegetables", ID=003},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Category()
{Name="Grains", ID=004},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Category()
{Name="Fruit", ID=005},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Category()
{Name="Other", ID=006}
![](/Images/OutliningIndicators/InBlock.gif)
};
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
static List<Product> products = new List<Product>()
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Cola", CategoryID=001},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Tea", CategoryID=001},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Mustard", CategoryID=002},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Pickles", CategoryID=002},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Carrots", CategoryID=003},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Bok Choy", CategoryID=003},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Peaches", CategoryID=005},
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
new Product
{Name="Melons", CategoryID=007},
![](/Images/OutliningIndicators/InBlock.gif)
};
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
好了,现在我们开始使用LINQ了,下面使用的表达式和方法的结果是一样的,这里的方法指Lambda表达式
l 使用排序
1. 使用排序时使用的显示语句
foreach (var c in orderByResult)
![](/Images/OutliningIndicators/None.gif)
Console.WriteLine("ID={0},Name={1}", c.ID, c.Name);
![](/Images/OutliningIndicators/None.gif)
2. 升序
表达式
var orderByResult = from c in categories![](/Images/OutliningIndicators/None.gif)
orderby c.ID //默认为升序,也可以在后面加上ascending
select c;![](/Images/OutliningIndicators/None.gif)
方法
var orderByResult = categories.OrderBy(c=>c.ID);![](/Images/OutliningIndicators/None.gif)
3. 降序
表达式
var orderByResult = from c in categories![](/Images/OutliningIndicators/None.gif)
orderby c.ID descending![](/Images/OutliningIndicators/None.gif)
select c;
![](/Images/OutliningIndicators/None.gif)
方法
var orderByResult = categories.OrderByDescending(c=>c.ID);
![](/Images/OutliningIndicators/None.gif)
4. 多个属性的升序
表达式
var orderByResult = from c in categories
![](/Images/OutliningIndicators/None.gif)
orderby c.ID,c.Name
![](/Images/OutliningIndicators/None.gif)
select c;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
方法
var orderByResult = categories.OrderBy(c=>c.ID).ThenBy(c=>c.Name);
![](/Images/OutliningIndicators/None.gif)
5. 多个属性的降序排列
表达式
var orderByResult = from c in categories
![](/Images/OutliningIndicators/None.gif)
orderby c.ID, c.Name descending
![](/Images/OutliningIndicators/None.gif)
select c;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
方法
var orderByResult = categories.OrderByDescending(c=>c.ID).ThenByDescending(c=>c.Name);
![](/Images/OutliningIndicators/None.gif)
l 使用Where条件
1. 使用Where的显示语句
foreach (var w in whereResult)
![](/Images/OutliningIndicators/None.gif)
Console.WriteLine("ID={0},Name={1}", w.ID, w.Name);
![](/Images/OutliningIndicators/None.gif)
2. 单个条件
表达式
var whereResult = from c in categories
![](/Images/OutliningIndicators/None.gif)
where c.Name == "Vegetables"
![](/Images/OutliningIndicators/None.gif)
select c;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
方法
var whereResult = categories.Where(c => c.Name == "Vegetables");
![](/Images/OutliningIndicators/None.gif)
3. 或条件(sql中的or)
表达式
var whereResult = from c in categories
![](/Images/OutliningIndicators/None.gif)
where c.Name == "Vegetables" || c.ID == 001
![](/Images/OutliningIndicators/None.gif)
select c;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
方法
var whereResult = categories.Where(c => (c.Name == "Vegetables" || c.ID == 001));![](/Images/OutliningIndicators/None.gif)
4. 与条件(sql中的and)
表达式
var whereResult = from c in categories
![](/Images/OutliningIndicators/None.gif)
where c.Name == "Vegetables" && c.ID == 001
![](/Images/OutliningIndicators/None.gif)
select c;
![](/Images/OutliningIndicators/None.gif)
方法
var whereResult = categories.Where(c => (c.Name == "Vegetables" && c.ID == 001));
l 连接
1. 内连接
表达式,注意在表达式中的使用join时相等要使用equals
var innerJoinQuery = from c in categories
![](/Images/OutliningIndicators/None.gif)
join prod in products on c.ID equals prod.CategoryID
![](/Images/OutliningIndicators/None.gif)
orderby c.ID
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
select new
{ CategoryID = c.ID,CategoryName = c.Name, ProductName = prod.Name};
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
方法
var innerJoinQuery = categories.Join(products,//要连接的集合
![](/Images/OutliningIndicators/None.gif)
a=>a.ID ,//第一个集合的主键
![](/Images/OutliningIndicators/None.gif)
b =>b.CategoryID , //第二个集合中和第一个集合的主键关联的键,类型需要和第一个集合的主键相同
![](/Images/OutliningIndicators/None.gif)
(c,d) => //c对应于第一个集合中的对象,d对于与第二个集合中的对象,声明2个变量
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
new
{CategoryID = c.ID,CategoryName = c.Name,ProductName = d.Name} //最终返回的结果类型
![](/Images/OutliningIndicators/None.gif)
);
![](/Images/OutliningIndicators/None.gif)
foreach (var item in innerJoinQuery)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("CategoryID = {0},CategoryName={1},ProductName={2}",item.CategoryID, item.CategoryName, item.ProductName);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2. 左连接
表达式
var leftJoinQuery = from c in categories
![](/Images/OutliningIndicators/None.gif)
join prod in products on c.ID equals prod.CategoryID into cp
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
from t in cp.DefaultIfEmpty(new Product
{ Name = "Unknown", CategoryID = 006 })
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
select new
{ CategoryID = c.ID, CategoryName = c.Name, ProductName = t.Name };
![](/Images/OutliningIndicators/None.gif)
foreach (var item in leftJoinQuery)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("CategoryID = {0},CategoryName={1},ProductName={2}",item.CategoryID, item.CategoryName, item.ProductName);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
方法
l 分组
表达式
var groupResults = from c in categories
![](/Images/OutliningIndicators/None.gif)
group c by c.ID;
![](/Images/OutliningIndicators/None.gif)
方法
var groupResults = categories.GroupBy(c => c.ID);
注意显示时的变化:
foreach (var item in groupResults)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(item.Key);
![](/Images/OutliningIndicators/InBlock.gif)
foreach (var c in item)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(" ID={0},Name={1}", c.ID, c.Name);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
由于刚开始学习LINQ,对LINQ的理解并不深,难免有不足之处,请大家见谅!