亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#使用LINQ查詢表達式的基本子句總結

2020-01-24 01:14:41
字體:
來源:轉載
供稿:網友

LINQ查詢表達式的基本語法很容易掌握,它使用C#常見的語言構造,從外觀上看,和我們常用的SQL類似,并且查詢表達式中的變量可以用匿名類型,所以在很多情況下,不需要指定變量類型就可以構建LINQ表達式。

LINQ的數據源可以是數據庫對象或是XML流等,也可以使實現了IEnumerable或者泛型IEnumberable<T>接口的集合對象。

LINQ的基本語法包含如下的8個上下文關鍵字,這些關鍵字和具體的說明如下:

關鍵字
說明
from 指定范圍變量和數據源
where 根據bool表達式從數據源中篩選數據
select 指定查詢結果中的元素所具有的類型或表現形式
group 對查詢結果按照鍵值進行分組(IGrouping<TKey,TElement>)
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子句
在select子句上可以非常靈活的處理查詢到的元素,然后再把結果返回。

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<TKey,TElement>泛型接口的對象序列。

語法和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的基本子句的常用用法,文字不是很多,因為代碼中都有詳細的注釋說明。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大学生性色视频| 成人综合国产精品| 九九热99久久久国产盗摄| 国产精品久久久久av免费| 日韩精品视频免费专区在线播放| 深夜成人在线观看| 日韩电影免费观看在线观看| 国产精品福利在线观看| 日韩国产激情在线| 日韩亚洲欧美成人| 免费不卡在线观看av| 日韩影视在线观看| 成人免费大片黄在线播放| 国产999视频| 色99之美女主播在线视频| 亚洲欧美三级在线| 美女福利精品视频| 亚洲电影免费观看高清完整版在线| 欧美激情视频一区二区| 成人福利在线观看| 亚洲欧美制服第一页| 久久久久久com| 日韩av在线直播| 欧美精品久久久久久久| 国产视频福利一区| 亚洲男人7777| 国产精品夜色7777狼人| 91成人在线观看国产| 精品国产一区二区在线| 97在线免费视频| 亚洲国产天堂久久综合| 欧美高清理论片| 久久露脸国产精品| 日韩欧美高清在线视频| 国产一区二区三区日韩欧美| 国产精品视频色| 国产欧美一区二区三区在线| 日韩在线视频一区| 欧美巨乳在线观看| 日韩成人久久久| 久久久久久久影院| 日韩成人av在线播放| 亚洲精品自产拍| 亚洲精品久久久久中文字幕二区| 97视频人免费观看| 日韩视频免费观看| 国产精品欧美风情| 国产精品视频永久免费播放| 欧美激情aaaa| 国产乱人伦真实精品视频| 亚洲一区二区日本| 亚洲欧洲一区二区三区在线观看| 欧美成人精品xxx| 国产成人在线播放| 亚洲欧美制服第一页| 亚洲欧美激情视频| 久久男人资源视频| 久久精品国产精品亚洲| 亚洲欧美日韩在线一区| 欧美又大粗又爽又黄大片视频| 亚洲欧美日韩中文在线| 国产精品黄色影片导航在线观看| 亚洲精品第一国产综合精品| 欧美尺度大的性做爰视频| 亚洲欧美国产精品| 国产欧美在线看| 国产999精品久久久影片官网| 美日韩精品免费观看视频| 日韩a**中文字幕| 亚洲天堂成人在线视频| 日韩欧美aⅴ综合网站发布| 成人在线免费观看视视频| 日韩电影网在线| 国产精品白丝jk喷水视频一区| 国产精品成人aaaaa网站| 欧美日韩在线观看视频小说| 亚洲国产精品国自产拍av秋霞| 国模叶桐国产精品一区| 精品国产成人在线| 欧美第一黄色网| 国产精品视频网址| 日韩欧美一区二区三区久久| 色偷偷888欧美精品久久久| 国产亚洲精品美女| 精品久久久久久| 免费av在线一区| 成人免费视频xnxx.com| 亚洲欧美综合另类中字| 欧美一级片在线播放| 国内精品小视频在线观看| 日韩在线视频国产| 欧美成aaa人片在线观看蜜臀| 日韩女在线观看| 欧美午夜精品久久久久久人妖| 91色精品视频在线| 欧美成年人视频| 91久久夜色精品国产网站| 欧美日韩午夜视频在线观看| 国产精品扒开腿做| 久久夜精品香蕉| 超碰97人人做人人爱少妇| 亚洲天堂成人在线| 亚洲精品一区二区三区婷婷月| 久久久国产精品视频| 亚洲欧美国产精品va在线观看| 国产成人中文字幕| 日韩欧美视频一区二区三区| 欧美在线一级va免费观看| 国产极品jizzhd欧美| 97人人模人人爽人人喊中文字| 亚洲欧美日韩高清| 成人午夜在线视频一区| 红桃av永久久久| 亚洲图片欧美日产| www.亚洲人.com| 成人免费高清完整版在线观看| 国产成人+综合亚洲+天堂| 久久精品国产一区二区三区| 91亚洲一区精品| 欧美激情亚洲另类| 不卡在线观看电视剧完整版| 欧美精品videos性欧美| 91综合免费在线| 国产精品久久久久久婷婷天堂| 国产一区二区三区日韩欧美| 国产经典一区二区| 伊人久久久久久久久久| 久久久免费观看| 国内精品久久久久影院优| 欧美午夜视频一区二区| 亚洲欧美激情四射在线日| 亚洲一区www| 欧美午夜片在线免费观看| 日韩欧美在线视频日韩欧美在线视频| 精品一区二区三区电影| 精品视频在线播放| 欧美日韩国产中字| 九九热99久久久国产盗摄| 91成人国产在线观看| 亚洲欧美日韩高清| 国产精品欧美一区二区| 亚洲精品456在线播放狼人| 国产精品吊钟奶在线| 美女性感视频久久久| 国产成人欧美在线观看| 亚洲精品一区二区久| 欧美高清在线视频观看不卡| 国产精品福利在线| 久久电影一区二区| 欧美xxxwww| 久久久精品2019中文字幕神马| 成人黄色大片在线免费观看| 日本aⅴ大伊香蕉精品视频| 国产一区二区丝袜高跟鞋图片| 美女精品视频一区| 欧洲精品在线视频| 国产精品视频免费在线| 日韩视频欧美视频| 粗暴蹂躏中文一区二区三区| 国产精品大陆在线观看| 成人激情黄色网| 亚洲美女av黄| 最新日韩中文字幕| 国外日韩电影在线观看|