settings.xml
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="color" value="red" />
<add key="size" value="large" />
<add key="price" value="23.99" />
</appSettings>
linq 扩展
using System.Collections.Generic;
namespace System.Linq // extend Microsoft’s namespace
{
public static class MyLinqExtensions
{
// this is a chainable LINQ extension method
public static IEnumerable<T> ProcessSequence<T>(
this IEnumerable<T> sequence)
{
// you could do some processing here
return sequence;
}
// these are scalar LINQ extension methods
public static int? Median(this IEnumerable<int?> sequence)
{
var ordered = sequence.OrderBy(item => item);
int middlePosition = ordered.Count() / 2;
return ordered.ElementAt(middlePosition);
}
public static int? Median<T>(
this IEnumerable<T> sequence, Func<T, int?> selector)
{
return sequence.Select(selector).Median();
}
public static decimal? Median(this IEnumerable<decimal?> sequence)
{
var ordered = sequence.OrderBy(item => item);
int middlePosition = ordered.Count() / 2;
return ordered.ElementAt(middlePosition);
}
public static decimal? Median<T>(
this IEnumerable<T> sequence, Func<T, decimal?> selector)
{
return sequence.Select(selector).Median();
}
public static int? Mode(this IEnumerable<int?> sequence)
{
var grouped = sequence.GroupBy(item => item);
var orderedGroups = grouped.OrderByDescending(group => group.Count());
return orderedGroups.FirstOrDefault().Key;
}
public static int? Mode<T>(
this IEnumerable<T> sequence, Func<T, int?> selector)
{
return sequence.Select(selector).Mode();
}
public static decimal? Mode(this IEnumerable<decimal?> sequence)
{
var grouped = sequence.GroupBy(item => item);
var orderedGroups = grouped.OrderByDescending(group => group.Count());
return orderedGroups.FirstOrDefault().Key;
}
public static decimal? Mode<T>(
this IEnumerable<T> sequence, Func<T, decimal?> selector)
{
return sequence.Select(selector).Mode();
}
}
}
示例
using System;
using static System.Console;
using Packt.Shared;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Xml.Linq;
namespace LinqWithEFCore
{
class Program
{
/*
Products that cost less than $10:
41: Jack's New England Clam Chowder costs $9.65
45: Rogede sild costs $9.50
47: Zaanse koeken costs $9.50
19: Teatime Chocolate Biscuits costs $9.20
23: Tunnbr?d costs $9.00
75: Rh?nbr?u Klosterbier costs $7.75
54: Tourtière costs $7.45
52: Filo Mix costs $7.00
13: Konbu costs $6.00
24: Guaraná Fantástica costs $4.50
33: Geitost costs $2.50
*/
static void FilterAndSort()
{
using (var db = new Northwind())
{
var query = db.Products
// query is a DbSet<Product>
.ProcessSequence()
.Where(product => product.UnitPrice < 10M)
// query is now an IQueryable<Product>
.OrderByDescending(product => product.UnitPrice)
// query is now an IOrderedQueryable<Product>
.Select(product => new //匿名类型 anonymous type
{
product.ProductID,
product.ProductName,
product.UnitPrice
});
WriteLine("Products that cost less than $10:");
foreach (var item in query)
{
WriteLine("{0}: {1} costs {2:$#,##0.00}",
item.ProductID, item.ProductName, item.UnitPrice);
}
WriteLine();
}
}
static void JoinCategoriesAndProducts()
{
using (var db = new Northwind())
{
//将每个产品加入其类别以返回 77 个匹配项 join every product to its category to return 77 matches
var queryJoin = db.Categories.Join(
inner: db.Products,
outerKeySelector: category => category.CategoryID,
innerKeySelector: product => product.CategoryID,
resultSelector: (c, p) =>
new { c.CategoryName, p.ProductName, p.ProductID })
.OrderBy(cp => cp.CategoryName);
foreach (var item in queryJoin)
{
WriteLine("{0}: {1} is in {2}.",
arg0: item.ProductID,
arg1: item.ProductName,
arg2: item.CategoryName);
}
}
}
/*
Beverages has 12 products.
Chai
Chang
Guaraná Fantástica
Sasquatch Ale
Steeleye Stout
C?te de Blaye
Chartreuse verte
Ipoh Coffee
Laughing Lumberjack Lager
Outback Lager
Rh?nbr?u Klosterbier
Lakkalik??ri
Condiments has 12 products.
Aniseed Syrup
Chef Anton's Cajun Seasoning
Chef Anton's Gumbo Mix
Grandma's Boysenberry Spread
Northwoods Cranberry Sauce
Genen Shouyu
Gula Malacca
Sirop d'érable
Vegie-spread
Louisiana Fiery Hot Pepper Sauce
Louisiana Hot Spiced Okra
Original Frankfurter grüne So?e
Confections has 13 products.
Pavlova
Teatime Chocolate Biscuits
Sir Rodney's Marmalade
Sir Rodney's Scones
NuNuCa Nu?-Nougat-Creme
Gumb?r Gummib?rchen
Schoggi Schokolade
Zaanse koeken
Chocolade
Maxilaku
Valkoinen suklaa
Tarte au sucre
Scottish Longbreads
Dairy Products has 10 products.
Queso Cabrales
Queso Manchego La Pastora
Gorgonzola Telino
Mascarpone Fabioli
Geitost
Raclette Courdavault
Camembert Pierrot
Gudbrandsdalsost
Flotemysost
Mozzarella di Giovanni
Grains/Cereals has 7 products.
Gustaf's Kn?ckebr?d
Tunnbr?d
Singaporean Hokkien Fried Mee
Filo Mix
Gnocchi di nonna Alice
Ravioli Angelo
Wimmers gute Semmelkn?del
Meat/Poultry has 6 products.
Mishi Kobe Niku
Alice Mutton
Thüringer Rostbratwurst
Perth Pasties
Tourtière
Paté chinois
Produce has 5 products.
Uncle Bob's Organic Dried Pears
Tofu
R?ssle Sauerkraut
Manjimup Dried Apples
Longlife Tofu
Seafood has 12 products.
Ikura
Konbu
Carnarvon Tigers
Nord-Ost Matjeshering
Inlagd Sill
Gravad lax
Boston Crab Meat
Jack's New England Clam Chowder
Rogede sild
Spegesild
Escargots de Bourgogne
R?d Kaviar
*/
static void GroupJoinCategoriesAndProducts()
{
using (var db = new Northwind())
{
// group all products by their category to return 8 matches
var queryGroup = db.Categories.AsEnumerable().GroupJoin(
inner: db.Products,
outerKeySelector: category => category.CategoryID,
innerKeySelector: product => product.CategoryID,
resultSelector: (c, matchingProducts) => new
{
c.CategoryName,
Products = matchingProducts//.OrderBy(p => p.ProductName)
});
foreach (var item in queryGroup)
{
WriteLine("{0} has {1} products.",
arg0: item.CategoryName,
arg1: item.Products.Count());
foreach (var product in item.Products)
{
WriteLine($" {product.ProductName}");
}
}
}
}
/*
Product count: 77
Highest product price: $263.50
Sum of units in stock: 3,119
Sum of units on order: 780
Average unit price: $28.87
Value of units in stock: $74,050.85
*/
static void AggregateProducts() //聚合序列: 均值 求和
{
using (var db = new Northwind())
{
WriteLine("{0,-25} {1,10}",
arg0: "Product count:",
arg1: db.Products.Count());
WriteLine("{0,-25} {1,10:$#,##0.00}",
arg0: "Highest product price:",
arg1: db.Products.Max(p => p.UnitPrice));
WriteLine("{0,-25} {1,10:N0}",
arg0: "Sum of units in stock:",
arg1: db.Products.Sum(p => p.UnitsInStock));
WriteLine("{0,-25} {1,10:N0}",
arg0: "Sum of units on order:",
arg1: db.Products.Sum(p => p.UnitsOnOrder));
WriteLine("{0,-25} {1,10:$#,##0.00}",
arg0: "Average unit price:",
arg1: db.Products.Average(p => p.UnitPrice));
WriteLine("{0,-25} {1,10:$#,##0.00}",
arg0: "Value of units in stock:",
arg1: db.Products.AsEnumerable()
.Sum(p => p.UnitPrice * p.UnitsInStock));
}
}
/*
Mean units in stock: 41
Mean unit price: $28.87
Median units in stock: 26
Median unit price: $19.50
Mode units in stock: 0
Mode unit price: $18.00
*/
static void CustomExtensionMethods()
{
using (var db = new Northwind())
{
WriteLine("Mean units in stock: {0:N0}",
db.Products.Average(p => p.UnitsInStock));
WriteLine("Mean unit price: {0:$#,##0.00}",
db.Products.Average(p => p.UnitPrice));
WriteLine("Median units in stock: {0:N0}",
db.Products.Median(p => p.UnitsInStock));
WriteLine("Median unit price: {0:$#,##0.00}",
db.Products.Median(p => p.UnitPrice));
WriteLine("Mode units in stock: {0:N0}",//库存模式单位
db.Products.Mode(p => p.UnitsInStock));
WriteLine("Mode unit price: {0:$#,##0.00}",
db.Products.Mode(p => p.UnitPrice));
}
}
/*
<products>
<product id="1" price="18">
<name>Chai</name>
</product>
<product id="2" price="19">
<name>Chang</name>
</product>
<product id="3" price="10">
<name>Aniseed Syrup</name>
</product>
<product id="4" price="22">
<name>Chef Anton's Cajun Seasoning</name>
</product>
<product id="5" price="21.35">
<name>Chef Anton's Gumbo Mix</name>
</product>
<product id="6" price="25">
<name>Grandma's Boysenberry Spread</name>
</product>
<product id="7" price="30">
<name>Uncle Bob's Organic Dried Pears</name>
</product>
<product id="8" price="40">
<name>Northwoods Cranberry Sauce</name>
</product>
<product id="9" price="97">
<name>Mishi Kobe Niku</name>
</product>
<product id="10" price="31">
<name>Ikura</name>
</product>
<product id="11" price="21">
<name>Queso Cabrales</name>
</product>
<product id="12" price="38">
<name>Queso Manchego La Pastora</name>
</product>
<product id="13" price="6">
<name>Konbu</name>
</product>
<product id="14" price="23.25">
<name>Tofu</name>
</product>
<product id="15" price="15.5">
<name>Genen Shouyu</name>
</product>
<product id="16" price="17.45">
<name>Pavlova</name>
</product>
<product id="17" price="39">
<name>Alice Mutton</name>
</product>
<product id="18" price="62.5">
<name>Carnarvon Tigers</name>
</product>
<product id="19" price="9.2">
<name>Teatime Chocolate Biscuits</name>
</product>
<product id="20" price="81">
<name>Sir Rodney's Marmalade</name>
</product>
<product id="21" price="10">
<name>Sir Rodney's Scones</name>
</product>
<product id="22" price="21">
<name>Gustaf's Kn?ckebr?d</name>
</product>
<product id="23" price="9">
<name>Tunnbr?d</name>
</product>
<product id="24" price="4.5">
<name>Guaraná Fantástica</name>
</product>
<product id="25" price="14">
<name>NuNuCa Nu?-Nougat-Creme</name>
</product>
<product id="26" price="31.23">
<name>Gumb?r Gummib?rchen</name>
</product>
<product id="27" price="43.9">
<name>Schoggi Schokolade</name>
</product>
<product id="28" price="45.6">
<name>R?ssle Sauerkraut</name>
</product>
<product id="29" price="123.79">
<name>Thüringer Rostbratwurst</name>
</product>
<product id="30" price="25.89">
<name>Nord-Ost Matjeshering</name>
</product>
<product id="31" price="12.5">
<name>Gorgonzola Telino</name>
</product>
<product id="32" price="32">
<name>Mascarpone Fabioli</name>
</product>
<product id="33" price="2.5">
<name>Geitost</name>
</product>
<product id="34" price="14">
<name>Sasquatch Ale</name>
</product>
<product id="35" price="18">
<name>Steeleye Stout</name>
</product>
<product id="36" price="19">
<name>Inlagd Sill</name>
</product>
<product id="37" price="26">
<name>Gravad lax</name>
</product>
<product id="38" price="263.5">
<name>C?te de Blaye</name>
</product>
<product id="39" price="18">
<name>Chartreuse verte</name>
</product>
<product id="40" price="18.4">
<name>Boston Crab Meat</name>
</product>
<product id="41" price="9.65">
<name>Jack's New England Clam Chowder</name>
</product>
<product id="42" price="14">
<name>Singaporean Hokkien Fried Mee</name>
</product>
<product id="43" price="46">
<name>Ipoh Coffee</name>
</product>
<product id="44" price="19.45">
<name>Gula Malacca</name>
</product>
<product id="45" price="9.5">
<name>Rogede sild</name>
</product>
<product id="46" price="12">
<name>Spegesild</name>
</product>
<product id="47" price="9.5">
<name>Zaanse koeken</name>
</product>
<product id="48" price="12.75">
<name>Chocolade</name>
</product>
<product id="49" price="20">
<name>Maxilaku</name>
</product>
<product id="50" price="16.25">
<name>Valkoinen suklaa</name>
</product>
<product id="51" price="53">
<name>Manjimup Dried Apples</name>
</product>
<product id="52" price="7">
<name>Filo Mix</name>
</product>
<product id="53" price="32.8">
<name>Perth Pasties</name>
</product>
<product id="54" price="7.45">
<name>Tourtière</name>
</product>
<product id="55" price="24">
<name>Paté chinois</name>
</product>
<product id="56" price="38">
<name>Gnocchi di nonna Alice</name>
</product>
<product id="57" price="19.5">
<name>Ravioli Angelo</name>
</product>
<product id="58" price="13.25">
<name>Escargots de Bourgogne</name>
</product>
<product id="59" price="55">
<name>Raclette Courdavault</name>
</product>
<product id="60" price="34">
<name>Camembert Pierrot</name>
</product>
<product id="61" price="28.5">
<name>Sirop d'érable</name>
</product>
<product id="62" price="49.3">
<name>Tarte au sucre</name>
</product>
<product id="63" price="43.9">
<name>Vegie-spread</name>
</product>
<product id="64" price="33.25">
<name>Wimmers gute Semmelkn?del</name>
</product>
<product id="65" price="21.05">
<name>Louisiana Fiery Hot Pepper Sauce</name>
</product>
<product id="66" price="17">
<name>Louisiana Hot Spiced Okra</name>
</product>
<product id="67" price="14">
<name>Laughing Lumberjack Lager</name>
</product>
<product id="68" price="12.5">
<name>Scottish Longbreads</name>
</product>
<product id="69" price="36">
<name>Gudbrandsdalsost</name>
</product>
<product id="70" price="15">
<name>Outback Lager</name>
</product>
<product id="71" price="21.5">
<name>Flotemysost</name>
</product>
<product id="72" price="34.8">
<name>Mozzarella di Giovanni</name>
</product>
<product id="73" price="15">
<name>R?d Kaviar</name>
</product>
<product id="74" price="10">
<name>Longlife Tofu</name>
</product>
<product id="75" price="7.75">
<name>Rh?nbr?u Klosterbier</name>
</product>
<product id="76" price="18">
<name>Lakkalik??ri</name>
</product>
<product id="77" price="13">
<name>Original Frankfurter grüne So?e</name>
</product>
</products>
*/
static void OutputProductsAsXml()//输出数组为xml格式
{
using (var db = new Northwind())
{
var productsForXml = db.Products.ToArray();
var xml = new XElement("products",
from p in productsForXml
select new XElement("product",
new XAttribute("id", p.ProductID),
new XAttribute("price", p.UnitPrice),
new XElement("name", p.ProductName)));
WriteLine(xml.ToString());
}
}
//xml设置
/*
color: red
size: large
price: 23.99
*/
static void ProcessSettings()
{
XDocument doc = XDocument.Load("settings.xml");
//Descendants 按文档顺序返回此文档或元素的后代元素的过滤集合。 集合中仅包含具有匹配 System.Xml.Linq.XName 的元素。
var appSettings = doc.Descendants("appSettings")
.Descendants("add")
.Select(node => new
{
Key = node.Attribute("key").Value,
Value = node.Attribute("value").Value
}).ToArray();
foreach (var item in appSettings)
{
WriteLine($"{item.Key}: {item.Value}");
}
}
static void Main(string[] args)
{
//FilterAndSort();
// JoinCategoriesAndProducts();
// GroupJoinCategoriesAndProducts();
// AggregateProducts();
// CustomExtensionMethods();
// OutputProductsAsXml();
ProcessSettings();
ReadLine();
}
}
}