【C# .NET】LINQ With EF Core

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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/cxyhjl/article/details/130239927
今日推荐