C\#LINQ 조회 표현 식 의 기본 자구 요약 사용 하기

22870 단어 LINQC#
LINQ 조회 표현 식 의 기본 문법 은 쉽게 파악 할 수 있 습 니 다.C\#흔히 볼 수 있 는 언어 구 조 를 사용 합 니 다.외관상 으로 볼 때 우리 가 자주 사용 하 는 SQL 과 유사 하고 조회 표현 식 의 변 수 는 익명 형식 을 사용 할 수 있 기 때문에 변수 유형 을 지정 하지 않 아 도 LINQ 표현 식 을 구축 할 수 있 습 니 다.
LINQ 의 데이터 원본 은 데이터베이스 대상 이나 XML 흐름 등 일 수도 있 고 IEnumerable 또는 범용 IEnumberable인터페이스의 집합 대상 을 실현 할 수도 있다.
LINQ 의 기본 문법 은 다음 과 같은 8 개의 문맥 키 워드 를 포함 하고 있 습 니 다.이러한 키워드 와 구체 적 인 설명 은 다음 과 같 습 니 다.
키워드
설명 하 다.
from
지정 한 범위 변수 와 데이터 원본
where
bool 표현 식 에 따라 데이터 원본 에서 데 이 터 를 선별 합 니 다.
select
검색 결과 에 있 는 요소 가 가지 고 있 는 유형 이나 표현 형식 을 지정 합 니 다.
group
검색 결 과 를 키 값 으로 묶 기(IGrouping)
into
join,group 또는 select 자구 결과 에 대한 참조 역할 을 할 수 있 는 식별 자 를 제공 합 니 다.
orderby
검색 한 요 소 를 정렬 합 니 다(ascending/descending)
join
두 개의 지 정 된 일치 조건 에 따라 Equals 는 두 개의 데이터 원본 을 연결 합 니 다.
let
검색 표현 식 의 하위 표현 식 검색 결 과 를 저장 하 는 범위 변 수 를 만 듭 니 다.
다음은 이 8 개의 키 워드 를 정리 하 는 데 자주 사용 되 는 검색 어 쓰기 입 니 다.
1.from 자구
LINQ 표현 식 을 쓰 려 면 from 자구 로 시작 해 야 합 니 다.개인 적 으로 from 자구 에서 주의해 야 할 부분 은 여러 from 자구 의 쓰기 라 고 생각 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace LINQ
{
  /// <summary>
  /// LINQ,     from           
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //1  form  
      string[] values = { "LINQ  ","LINQ    ","from  ","  from  "};
      var value = from v in values
            where v.IndexOf("LINQ") > -1
            select new { v, v.Length };
      foreach (var n in value)
      {
        Console.WriteLine("{0},{1}",n.v,n.Length );
      }
      Console.ReadKey(false);
      //2  LINQ  ArrayList
      ArrayList gList = new ArrayList();
      gList.Add(new GustInfo { Name="DebugLZQ", Age=26, Tel="88888888"});
      gList.Add(new GustInfo { Name="   ",Age=6, Tel ="666666"});
      gList.Add(new GustInfo { Name = "M&MSoft", Age =9, Tel = "55555" });

      var query = from GustInfo gust in gList
            where gust.Age > 9
            select gust;//    gust       
      foreach (GustInfo g in query)
      {
        Console.WriteLine("{0}   :{1}   :{2}",g.Name,g.Age,g.Tel );
      }
      Console.ReadKey(false);
      //3  from  
      List<GustInfo2> gList2 = new List<GustInfo2>() 
      {
        new GustInfo2{ Name="DebugLZQ",Age=26,TelTable=new List<string>(){"8888888","138******"}},
        new GustInfo2{ Name="   ",Age=6,TelTable =new List<string>(){"666666","138******"}},
        new GustInfo2{ Name="M&MSoft",Age=9,TelTable=new List<string>(){"55555","138******"}}
      };

      //gust、tel      ,          !!!
      var query2 = from gust in gList2
             from tel in gust.TelTable 
             where tel.IndexOf("5555") > -1
             select gust;
      foreach (var g in query2)
      {
        Console.WriteLine("{0}   {1}",g.Name,g.Age );
        foreach (var t in g.TelTable)
        {
          Console.WriteLine("  :{0}",t);
        }
      }

      Console.ReadKey(false);

      //4  from  
      var query3 = from GustInfo gust in gList
             where gust.Age > 6
             from GustInfo2 gust2 in gList2
             where gust2.Age> 9
             select new { gust, gust2 };//      
      foreach (var g in query3)
      {
        Console.WriteLine("{0} {1}", g.gust.Name, g.gust2.Name);
      }

      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637153703558.png (677×442)
프로그램 에서 from 자구 의 용법 예 시 를 열거 하 였 으 며,복합 from 자구 와 여러 from 자구 의 작성 에 주의 하 는 동시에 범위 변수 와 데이터 소스 변수 라 는 두 개념 을 이해 해 야 한다.
 2.where 자구
where 자 구 는 LINQ 표현 식 의 요소 선별 메커니즘 입 니 다.시작 과 끝 을 제외 하고 LINQ 표현 식 의 임 의 위치 에 거의 나타 날 수 있 습 니 다.
LINQ 표현 식 에 where 자구 가 있 을 수도 있 고 없 을 수도 있 습 니 다.하나 가 있 을 수도 있 고 여러 개가 있 을 수도 있다.여러 where 자구 간 의 논리 적 관 계 는 논리 적'과'에 해당 합 니 다.각 where 자 구 는 1 개 이상 의 bool 논리 표현 식 을 포함 할 수 있 습 니 다.이러한 조건 은 서술 어 가 되 고 서술 어 논리 간 에는 SQL 의 and,or 가 아 닌'&'|'등 을 사용 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_WHERE
{
  /// <summary>
  /// LINQ where  
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //1   where  
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ", Age=26,Tel="88888888"},
        new GustInfo(){ Name="cnblogs",Age=6,Tel="666666"},
        new GustInfo(){ Name="M&MSoft",Age=9,Tel="55555"}
      };

      var query = from gust in gList
            where (gust.Name.Length > 7 || gust.Name.Substring(0, 1) == "M") && gust.Age > 9
            select new { gust.Name, gust.Age };
      foreach (var g in query)
      {
        Console.WriteLine("{0},{1}", g.Name, g.Age);
      }

      Console.ReadKey(false);

      //2. where          
      var query2 = from GustInfo gust in gList
             where gust.Name.Length > 5
             && Check(gust.Name)
             select gust;
      foreach (var g in query2)
      {
        Console.WriteLine("{0},{1},{2}", g.Name, g.Age, g.Tel);
      }
      Console.ReadKey(false);

      //3.       
      //        ,            
      string[] names = { "SB","XXX","***","@@@","     "};

      var query3 = from GustInfo guest in gList
             where !names.Contains(guest.Name)
             select guest;

      foreach (var q in query3)
      {
        Console.WriteLine("{0}   :{1},  :{2}",q.Name,q.Age,q.Tel );
      }
      Console.ReadKey(false);
    }

    //     
    static bool Check(string name)
    {
      if (name.Substring(0, 1) == "N")
        return false;
      return true;
    }
  }
}

자주 사용 하 는 where 자구 의 작법 에 주의해 야 한다.프로그램의 실행 결 과 는 다음 과 같다.
201637153755441.png (677×442)
3.Select 자구
selection 자구 에서 조 회 된 요 소 를 매우 유연 하 게 처리 한 후에 결 과 를 되 돌려 줍 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_select
{
  /// <summary>
  /// LINQ select
  ///  select   ,               ,        
  /// </summary>
  class MyGustInfo
  {
    public string Name { get; set; }
    public int Age { get; set; }
  }
  class Program
  {
    static void Main(string[] args)
    {
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ", Age=25, Tel="88888888"},
         new GustInfo(){ Name="cnblogs", Age=6, Tel="666666"},
         new GustInfo(){ Name="M&M", Age=9, Tel="55555"}
      };
      var query = from gust in gList
            where gust.Age >= 9 && gust.Age <= 30
            select gust.Name.Replace("&", "mm");//select      
      var query2 = from gust in gList
             where gust.Age >= 9 && gust.Age <= 30
             select MyProc(gust.Name);
      var query3 = from gust in gList
             where gust.Age >= 9 && gust.Age <= 30
             select new { gust.Name,gust.Age};

      var query4 = from gust in gList
             where gust.Age >= 9 && gust.Age <= 30
             select new MyGustInfo { Name=gust.Name+"My", Age=gust.Age+1};//         

      foreach (var v in query)
      {
        Console.WriteLine(v);
      }
      foreach (var v in query2)
      {
        Console.WriteLine(v);
      }
      foreach (var v in query3)
      {
        Console.WriteLine(v.Name+v.Age );
      }
      foreach (var v in query4)
      {
        Console.WriteLine(v.Name+v.Age );
      }

      Console.ReadKey(false);
    }
    static string MyProc(string s)
    {
      return s + "Better";
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.

 4.group 자구
 문법 에 따 르 면 LINQ 표현 식 은 from 자구 로 시작 하여 select 또는 group 자구 로 끝나 야 하기 때문에 select 를 사용 하여 결 과 를 되 돌려 주 는 것 외 에 group 자 구 를 사용 하여 요소 가 조 성 된 결 과 를 되 돌려 줄 수도 있 습 니 다.
group 자 구 는 IGrouping범용 인 터 페 이 스 를 기반 으로 한 대상 서열 을 되 돌려 줍 니 다.
문법 과 SQL 의 group 은 약간 다 르 기 때문에 주의 하지 않 으 면 잘못 쓸 수 있 습 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_group
{
  /// <summary>
  /// LINQ group  
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},
        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},
        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},
        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},
        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},
        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},
      };

      var query = from guest in gList
            group guest by guest.Name.Substring(0, 1);//   key string  

      //           
      foreach (IGrouping<string, GustInfo> guestGroup in query)
      {
        Console.WriteLine("   :{0}",guestGroup.Key );
        foreach (var g in guestGroup)
        {
          Console.WriteLine("{0}   :{1}   :{2}",g.Name,g.Age,g.Tel );
        }
      }
      Console.ReadKey(false);

      Console.WriteLine("-----------------------------------");

      var query2 = from guest in gList
             group guest by guest.Age > 20;//   key bool        

      foreach (IGrouping<bool, GustInfo> guestGroup in query2)
      {
        Console.WriteLine("      20    :{0}", guestGroup.Key);
        foreach (var g in guestGroup)
        {
          Console.WriteLine("{0}   :{1}   :{2}", g.Name, g.Age, g.Tel);
        }
      }
      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637153931581.png (677×442)
5.into 자구
 into 자 구 는 임시 식별 자로 서 group,select,join 자구 에서 그 결과 의 인용 을 충당 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_into
{
  /// <summary>
  /// LINQ group
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},
        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},
        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},
        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},
        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},
        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},
      };

      //1.into  group  
      var query = from guest in gList
            group guest by guest.Name.Substring(0, 1) into grguest
            orderby grguest.Key descending
            select grguest;

      var query2 = from guest in gList
            group guest by guest.Name.Substring(0, 1) into grguest
            orderby grguest.Key ascending 
            select grguest;

      //2.select     into  
      var query3 = from guest in gList
             select new { NewName = guest.Name, NewAge = guest.Age } into newguest
             orderby newguest.NewAge
             select newguest;

      foreach (var guestGroup in query)
      {
        Console.WriteLine("   :{0}",guestGroup.Key );
        foreach (var g in guestGroup)
        {
          Console.WriteLine("{0}   :{1}",g.Name,g.Tel );
        }
      }
      Console.ReadKey(false);

      foreach (var newg in query3)
      {
        Console.WriteLine("{0}   :{1}",newg.NewName,newg.NewAge );
      }

      Console.ReadKey(false);
    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637154008267.png (677×442)
6.orderby 자구,thenby 자구
 LINQ 는 요소 의 하나 또는 여러 속성 에 따라 요 소 를 정렬 할 수 있 습 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_orderby
{
  class Program
  {
    /// <summary>
    /// LINQ orderby (ascending descending)
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},
        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},
        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},
        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},
        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},
        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},
      };

      //      
      var query = from guest in gList
            orderby guest.Age
            select guest;
      var query1 = from guest in gList
             orderby guest.Age ascending
             select guest;
      var query2 = from guest in gList
             orderby guest.Age descending
             select guest;
      //        ,            
      var query3 = from guest in gList
            orderby guest.Age, guest.Name.Length
            select guest;
      var query4 = from guest in gList
             orderby guest.Age descending , guest.Name.Length ascending 
             select guest;
      var query5 = from guest in gList
             orderby guest.Age, guest.Name.Length,guest.Tel 
             select guest;

      foreach (var guest in query2)
      {
        Console.WriteLine("{0}   :{1}   :{2}",guest.Name,guest.Age,guest.Tel );
      }
      Console.ReadKey(false);
      foreach (var guest in query4)
      {
        Console.WriteLine("{0}   :{1}   :{2}", guest.Name, guest.Age, guest.Tel);
      }
      Console.ReadKey(false);
    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637154108735.png (677×442)
7.let 자구
let 자 구 는 LINQ 표현 식 에 하위 표현 식 의 계산 결 과 를 저장 하 는 데 사 용 됩 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_let
{
  /// <summary>
  /// LINQ let             
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},
        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},
        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},
        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},
        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},
        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},
      };

      //  let        g,   g       
      var query = from guest in gList
            let g = guest.Name.Substring(0, 1)
            where g == "D" || g == "J"
            select guest;
      //      let,         
      var query2 = from guest in gList
             where guest.Name.Substring(0, 1) == "D" || guest.Name.Substring(0, 1) == "J"
             select guest;

      foreach (var g in query)
      {
        Console.WriteLine("{0}   :{1}   :{2}",g.Name,g.Age,g.Tel );
      }
      Console.ReadKey(false);
      Console.WriteLine("   let,       ");
      foreach (var g in query2)
      {
        Console.WriteLine("{0}   :{1}   :{2}", g.Name, g.Age, g.Tel);
      }
      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637154137605.png (677×442)
8.join 자구
만약 에 하나의 데이터 소스 에서 요소 의 특정한 속성 이 다른 데이터 소스 의 특정한 속성 과 똑 같이 비교 할 수 있다 면 이 두 데이터 소스 는 join 자구 로 연결 할 수 있다.
join 자 구 는 equals 키 워드 를 사용 하여 같은 비 교 를 합 니 다.자주 사용 하 는 이등 호 가 아 닙 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_join
{
  class Program
  {
    static void Main(string[] args)
    {
      //       
      List<GustInfo> gList = new List<GustInfo>() 
      {
        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},
        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},
        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},
        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},
        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},
        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},
      };

      List<GuestTitle> titleList = new List<GuestTitle>() 
      {
        new GuestTitle(){Name="DebugLZQ",Title="Soft Engineer"},
        new GuestTitle(){Name="DebugLZQ",Title="Team Leader"},
        new GuestTitle(){Name="Sarah",Title="Test Engineer"},
        new GuestTitle(){Name="Jerry",Title="Head Master"}
      };
      //1.         
      var query = from guest in gList
            join title in titleList on guest.Name equals title.Name
            select new { Name=guest.Name ,Title=title.Title,Age=guest.Age };

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1}   :{2}",g.Name,g.Title ,g.Age );
      }
      Console.ReadKey(false);

      //     from       :        :                
      var query2=from guest in gList 
            from title in titleList 
            where guest.Name==title.Name
            select new { Name = guest.Name, Title = title.Title, Age = guest.Age };

      foreach (var g in query2)
      {
        Console.WriteLine("{0} {1}   :{2}", g.Name, g.Title, g.Age);
      }
      Console.ReadKey(false);

      //2.          
      //       ,            
      var query3 = from guest in gList
             join title in titleList on guest.Name equals title.Name into tgroup
             select new { Name=guest.Name,Titles=tgroup };

      foreach (var g in query3)
      {
        Console.WriteLine(g.Name);
        foreach (var g2 in g.Titles)
        {
          Console.WriteLine("  {0}",g2.Title );
        }
      }
      Console.ReadKey(false);
      //3.          
      //         
      var query4 = from guest in gList
             join title in titleList on guest.Name equals title.Name into tgroup
             from subtitle in tgroup.DefaultIfEmpty()
             select new { Name=guest.Name,Title=subtitle==null?"  ":subtitle.Title };
      foreach (var g in query4)
      {
        Console.WriteLine("{0} {1} ",g.Name ,g.Title );
      }
      Console.ReadKey(false);
      
    }
  }
}

프로그램 결 과 는 다음 과 같 습 니 다.
201637154220463.png (677×442)
이상 은 LINQ 의 기본 자구 의 상용 용법 으로 문자 가 많 지 않 습 니 다.코드 에 상세 한 주석 설명 이 있 기 때 문 입 니 다.

좋은 웹페이지 즐겨찾기