精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么說LINQ要勝過SQL

運維 數據庫運維
流行的說法是 LINQ 同 C#(或者 VB)集成在了一起,故而消除了編程語言和數據庫之間配合上的鴻溝,同時為多個數據源的組合提供了單一的查詢接口。雖然這些都是事實,但僅是故事的一部分。更重要的是:當要對數據庫進行查詢的時候,LINQ 在大多數情況下都比 SQL 更加有效。

[[186565]]

如果你還沒有沉溺于 LINQ,就會想這有啥大驚小怪的。SQL 并沒有壞掉,為什么還要對它進行修補呢? 為什么我們還需要另外一種查詢語言呢?

流行的說法是 LINQ 同 C#(或者 VB)集成在了一起,故而消除了編程語言和數據庫之間配合上的鴻溝,同時為多個數據源的組合提供了單一的查詢接口。雖然這些都是事實,但僅是故事的一部分。更重要的是:當要對數據庫進行查詢的時候,LINQ 在大多數情況下都比 SQL 更加有效。

同 SQL 相比, LINQ 更簡單、整潔而且高級。這樣子更像是拿 C# 同 C++ 做比較。真的,盡管有時候使用 C++ 仍然是最好的選擇(比如使用 SQL 的場景),但在大多數場景中,使用現代整潔的語言而不必為底層細節操作就是一項大勝利。

SQL 是一門非常古老的語言—發明于 1974 年。雖然經歷過了無數此擴展,但從來沒有被重新設計過。這就使得它有點混亂了—不像是 VB6 或者 Visual FoxPro。你也許已經慢慢變得習慣于此因而看不到任何錯漏的地方!

讓我們來看一個例子。你想要編寫一個簡單的查詢來獲取客戶數據,如下:

  1. SELECT UPPER(Name
  2.  
  3. FROM Customer 
  4.  
  5. WHERE Name LIKE 'A%' 
  6.  
  7. ORDER BY Name 

 

現在假設要將結果集里的這些數據提供給一個網頁,并且我們想獲取第 21 到 30 行數據。所以我們需要一個子查詢:

  1. SELECT UPPER(NameFROM 
  2.  
  3.  
  4.    SELECT *, RN = row_number() 
  5.  
  6.    OVER (ORDER BY Name
  7.  
  8.    FROM Customer 
  9.  
  10.    WHERE Name LIKE 'A%' 
  11.  
  12. ) A 
  13.  
  14. WHERE RN BETWEEN 21 AND 30 
  15.  
  16. ORDER BY Name 

 

而如果你需要支持版本(在 SQL Server 2005 之前的)更老的數據庫,情況會更糟糕:

  1. SELECT TOP 10 UPPER (c1.Name
  2.  
  3. FROM Customer c1 
  4.  
  5. WHERE 
  6.  
  7.    c1.Name LIKE 'A%' 
  8.  
  9.    AND c1.ID NOT IN 
  10.  
  11.    ( 
  12.  
  13.       SELECT TOP 20 c2.ID 
  14.  
  15.       FROM Customer c2 
  16.  
  17.       WHERE c2.Name LIKE 'A%' 
  18.  
  19.       ORDER BY c2.Name 
  20.  
  21.    )  
  22.  
  23. ORDER BY c1.Name 

 

這樣做不僅復雜而混亂,而且也違背了 DRY 原則。如下是使用 LINQ 實現相同的查詢功能。顯然在簡單性上更勝一籌:

  1. var query = 
  2.  
  3.    from c in db.Customers 
  4.  
  5.    where c.Name.StartsWith ("A"
  6.  
  7.    orderby c.Name 
  8.  
  9.    select c.Name.ToUpper(); 
  10.  
  11.   
  12.  
  13. var thirdPage = query.Skip(20).Take(10); 

 

只有當我們枚舉到 thirdPage 時,查詢才會實際執行。在從 LINQ 到 SQL 或者 Entity Framework 的場景中,翻譯引擎會將(我們用兩個步驟組合而成的)查詢轉換成一個 SQL 語句,這個語句是針對其所連接的數據庫服務器進行了優化的。

可組合性

您可能已經注意到 LINQ 的另一個更微妙(微妙但意義重大)的好處。我們選擇了組合中的兩個查詢步驟:

  1. IQueryable Paginate (this IQueryable query, int skip, int take) 
  2.  
  3.  
  4.    return query.Skip(skip).Take(take); 
  5.  

 

我們可以這樣做:

  1. var query = ... 
  2.  
  3. var thirdPage = query.Paginate (20, 10); 

 

更重要的是,在這里我們可以進行任意的分頁查詢。換言之就是通過 LINQ 你可以把查詢分解成一部分,然后在你的應用程序中重用。

聯合

LINQ 另一好處就是你可以不用 JOIN 就能進行關系間查詢。例如,我們想要列出所有購物在 $1000 或者以上,并且居住在華盛頓的顧客。我們會假定讓購買項目化(也就是經典的采購/項目采購場景)并且把(沒有顧客記錄的)現金銷售也囊括進來。這就需要在四個表(Purchase, Customer, Address 以及 PurchaseItem)之間進行查詢。使用 LINQ,這樣的查詢不費吹灰之力:

  1. from p in db.Purchases 
  2.  
  3. where p.Customer.Address.State == "WA" || p.Customer == null 
  4.  
  5. where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000 
  6.  
  7. select p 

 

將此與同等功能的 SQL 相比較:

  1. SELECT p.* 
  2.  
  3. FROM Purchase p 
  4.  
  5.     LEFT OUTER JOIN  
  6.  
  7.         Customer c INNER JOIN Address a ON c.AddressID = a.ID 
  8.  
  9.     ON p.CustomerID = c.ID 
  10.  
  11. WHERE 
  12.  
  13.    (a.State = 'WA' || p.CustomerID IS NULL
  14.  
  15.     AND p.ID in 
  16.  
  17.     ( 
  18.  
  19.         SELECT PurchaseID FROM PurchaseItem 
  20.  
  21.         GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 
  22.  
  23.     ) 

 

對此例進一步擴展,假設我們想要將結果集按價格進行逆序排列,并在最終的投影中顯示銷售員的姓名以及所購買項目的數量。我們可以自然不重復地表達出這些附件的查詢條件:

  1. from p in db.Purchases 
  2.  
  3. where p.Customer.Address.State == "WA" || p.Customer == null 
  4.  
  5. let purchaseValue = p.PurchaseItems.Sum (pi => pi.SaleAmount) 
  6.  
  7. where purchaseValue > 1000 
  8.  
  9. orderby purchaseValue descending 
  10.  
  11. select new 
  12.  
  13.  
  14.    p.Description, 
  15.  
  16.    p.Customer.SalesPerson.Name
  17.  
  18.    PurchaseItemCount = p.PurchaseItems.Count() 
  19.  

 

下面是使用 SQL 實現相同的查詢:

  1. SELECT  
  2.  
  3.     p.Description, 
  4.  
  5.     s.Name
  6.  
  7.     (SELECT COUNT(*) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) PurchaseItemCount 
  8.  
  9. FROM Purchase p 
  10.  
  11.     LEFT OUTER JOIN  
  12.  
  13.         Customer c  
  14.  
  15.             INNER JOIN Address a ON c.AddressID = a.ID 
  16.  
  17.             LEFT OUTER JOIN SalesPerson s ON c.SalesPersonID = s.ID 
  18.  
  19.     ON p.CustomerID = c.ID 
  20.  
  21. WHERE 
  22.  
  23.     (a.State = 'WA' OR p.CustomerID IS NULL
  24.  
  25.     AND p.ID in 
  26.  
  27.     ( 
  28.  
  29.         SELECT PurchaseID FROM PurchaseItem 
  30.  
  31.         GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 
  32.  
  33.     ) 
  34.  
  35. ORDER BY 
  36.  
  37.     (SELECT SUM (SaleAmount) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) DESC 

 

有意思的是可以將上述 SQL 查詢轉換回到 LINQ,所生成的查詢每一塊都會有傻瓜式重復。論壇里常會貼出這樣的查詢(通常是非工作的版本)——這是用 SQL 進行思考而不是以 LINQ 進行思考的結果。這就像是是將 Fortran 程序轉換成 C# 6 時會抱怨 GOTO 的笨拙語法一樣。

數據修整

在查詢聯合中從多個表選擇數據 – 最終的結果會是一個扁平的以行為單位的元組。如果你使用了多年的 SQL,你可能認為這種事不會發生在你身上——它導致數據重復,從而使得結果集無法在客戶端很好地使用。所以當它發生時往往難以接受。與此相反,LINQ 讓你可以獲取到休整過的分層級的數據。這就避免了重復,讓結果集容易處理,而且在大多數情況下也會消除進行聯合操作的必要。例如,假設我們想要提取一組顧客,每一條記錄都帶上了它們的高價值交易。使用 LINQ,你可以這樣做:

  1. from c in db.Customers 
  2.  
  3. where c.Address.State == "WA" 
  4.  
  5. select new 
  6.  
  7.  
  8.    c.Name
  9.  
  10.    c.CustomerNumber, 
  11.  
  12.    HighValuePurchases = c.Purchases.Where (p => p.Price > 1000) 
  13.  

 

HighValuePurchases,在這里是一個集合。由于我們查詢的是一個相關屬性,就不需要進行聯合了。因此這是一個內聯合還是外聯合的細節問題就被很好的抽象掉了。在此例中,當翻譯成了 SQL,可能就是一個外聯合:LINQ 不會因為子集合返回的是零個元素就排除行。如果我們想要有一個可以翻譯成一個內聯合的東西,可以這樣做:

 

  1. from c in db.Customers 
  2.  
  3. where c.Address.State == "WA" 
  4.  
  5. let HighValuePurchases = c.Purchases.Where (p => p.Price > 1000)where HighValuePurchases.Any()select new 
  6.  
  7.  
  8.    c.Name
  9.  
  10.    c.CustomerNumber, 
  11.  
  12.    HighValuePurchases 
  13.  

 

LINQ 還通過一組豐富的操作符對平面外聯合、自聯合、組查詢以及其它各種不同類型查詢進行了支持。

參數化

如果我們想要將之前的例子參數化會如何呢,如此”WA”狀態是不是就要來自于一個變量呢? 其實我們只要像下面這樣做就可以了:

  1. string state = "WA"
  2.  
  3.   
  4.  
  5. var query = 
  6.  
  7.    from c in db.Customers 
  8.  
  9.    where c.Address.State == state 
  10.  
  11.    ... 

 

不會混淆 DbCommand 對象上面的參數,或者擔心 SQL 注入攻擊。 LINQ 的參數化是內聯、類型安全并且高度可讀的。它不僅解決了問題——而且解決得很不錯。

因為 LINQ 查詢時可以進行組合,所以我們可以有條件的添加謂詞。例如,我們寫出一個方法,如下:

  1. IQueryable GetCustomers (string state, decimal? minPurchase) 
  2.  
  3.  
  4.     var query = Customers.AsQueryable(); 
  5.  
  6.      
  7.  
  8.     if (state != null
  9.  
  10.         query = query.Where (c => c.Address.State == state); 
  11.  
  12.      
  13.  
  14.     if (minPurchase != null
  15.  
  16.         query = query.Where (c => c.Purchases.Any (p => p.Price > minPurchase.Value)); 
  17.  
  18.      
  19.  
  20.     return query; 
  21.  

 

如果我們使用空的 state 以及 minPurchase 值調用了這個方法,那么在我們枚舉結果集的時候如下 SQL 就會被生成出來:

  1. SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] 
  2.  
  3. FROM [Customer] AS [t0] 

 

不過,如果我們指定了 state 和 minPurchase 的值,LINQ 到 SQL 就不只是向查詢添加了謂詞,還會有必要的聯合語句:

  1. SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] 
  2.  
  3. FROM [Customer] AS [t0] 
  4.  
  5. LEFT OUTER JOIN [Address] AS [t1] ON [t1].[ID] = [t0].[AddressID] 
  6.  
  7. WHERE (EXISTS( 
  8.  
  9.     SELECT NULL AS [EMPTY] 
  10.  
  11.     FROM [Purchase] AS [t2] 
  12.  
  13.     WHERE ([t2].[Price] > @p0) AND ([t2].[CustomerID] = [t0].[ID]) 
  14.  
  15.     )) AND ([t1].[State] = @p1) 

 

因為我們的方法返回了一個 IQueryable,查詢在枚舉到之前并不會被實際地轉換成 SQL 并加以執行。這樣就給了調用進一步添加謂詞、分頁、自定義投影等等的機會。

靜態類型安全

在之前的查詢中,如果我們將 state 變量聲明成了一個整型數而不是一個字符串,那么查詢可能在編譯時就會報錯,而不用等到運行時。這個也同樣適用于把表名或者列名弄錯的情況。這在重構時有一個很實在的好處:如果你沒有完成手頭的工作,編譯器會給出提示。

客戶端處理

LINQ 讓你可以輕松地將查詢的一些部分轉移到客戶端上進行處理。對于負載負擔較大的數據庫服務器,這樣做可實際提升性能。只要你所取數據沒有超過所需(換言之,你還是要在服務器上做過濾),就可以經常性地通過把對結果集進行重新排序、轉換以及重組的壓力轉移到負載較少的應用服務器上去。使用 LINQ,你需要做的就是 AsEnumerable() 轉移到查詢之中,而自那個點之后的所有事情都可以在本地執行。

什么時候不用 LINQ 去查詢數據庫

盡管 LINQ 的功能強大,但是它并不能取代 SQL。它可以滿足 95% 以上的需求,不過你有時仍然需要SQL:

  • 需要手動調整的查詢 (特殊是需要優化和進行鎖定提示的時候);
  • 有些涉及到要 select 臨時表,然后又要對那些表進行查詢操作的查詢;
  • 預知的更新以及批量插入操作。

還有就在用到觸發器時,你還是需要 SQL。 (盡管在使用 LINQ 的時候諸如此類的東西并非常常被需要,但在要使用存儲過程和函數的時候,SQL 是不可或缺的)。你可以通過在 SQL 中編寫表值函數來將 SQL 與 LINQ 結合在一起, 然后在更加復雜的 LINQ 查詢里面調用這些函數。

了解兩門查詢語言并不是問題,因為無論如何你都會想要去學習 LINQ 的 — LINQ 在查詢本地集合以及 XML DOM 的時候非常實用。如果你使用的仍然是老舊的基于 XmlDocument 的 DOM,LINQ to XML 的 DOM 操作會是一種具有戲劇效果的進步。

還有就是相比于 SQL, LINQ 更易于掌握,所以如果你想寫個不錯的查詢,使用 LINQ 會比 SQL 更好達成。

將 LINQ 用于實戰

我幾乎是只用 LINQ 來做數據庫查詢,因為它更有效率。

對于應用程序的編寫而言,我的個人經驗是一個使用 LINQ 的數據訪問層(使用一個像 LINQ 到 SQL 或者 Entity Framework 的 API)可以將數據訪問的開發時間砍掉一半,而且可以讓維護工作更加的輕松。 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2015-11-26 09:10:30

2016-07-01 14:37:01

SparkSQL

2021-04-12 10:28:51

機器學習人工智能AI

2022-06-09 08:32:21

SQLNOLOCKWITH

2021-09-14 10:48:13

SQL Nolock代碼

2022-11-15 08:35:00

SQLNOLOCK數據

2023-04-06 08:43:29

SQLWITH(NOLOCK

2018-06-21 09:30:50

比特幣區塊鏈擴容

2016-09-22 16:06:21

微服務架構RPC框架

2020-12-20 17:37:38

Java開發代碼

2011-11-08 09:18:42

云計算開源OpenStack

2011-08-01 14:33:44

SQL

2015-08-06 10:14:15

造輪子facebook

2022-08-15 08:27:02

基站網絡

2013-03-12 14:30:09

Ubuntu操作系統

2018-08-21 21:55:53

2016-12-14 12:02:01

StormHadoop大數據

2017-02-14 14:20:02

StormHadoop

2024-10-17 16:41:57

KafkaZooKeeper

2021-02-11 13:30:56

Nodejs源碼c++
點贊
收藏

51CTO技術棧公眾號

日韩欧美国产三级电影视频| 国产欧美精品区一区二区三区| 久久久久久久一区二区三区| 亚洲一区二区三区四区五区六区| 欧美舌奴丨vk视频| 日韩美女精品在线| 精品人伦一区二区三区| 一区二区乱子伦在线播放| 欧美.www| 一本色道久久88综合日韩精品| 香蕉视频xxxx| 久久精品女人天堂av免费观看| 自拍偷在线精品自拍偷无码专区 | 久久久精品免费看| 日本欧美国产| 亚洲精品xxxx| 国产亚洲色婷婷久久| 欧美日韩视频网站| 午夜影院在线观看欧美| 一级一片免费播放| 天堂中文在线资| 极品少妇xxxx精品少妇偷拍| 欧美与黑人午夜性猛交久久久| 一区二区三区四区五区| 精品国产乱码久久久久久果冻传媒| 日韩视频免费观看高清完整版| 黄色aaa级片| 中文在线а√天堂| 亚洲永久免费视频| 久久av秘一区二区三区| 91在线直播| 久久综合色8888| www.成人三级视频| 国产精品-色哟哟| 日韩激情一二三区| 日本道色综合久久影院| 日韩免费黄色片| 欧美精品福利| 欧美成人精品h版在线观看| 欧美激情视频二区| 精品国产一区二区三区| 亚洲精品中文字幕av| 亚洲 欧美 日韩在线| 日韩成人18| 欧美一级高清片| 99九九99九九九99九他书对| 欧美一级免费| 欧美精品亚洲二区| 亚洲欧美偷拍另类| 国产成人久久精品麻豆二区| 在线免费视频一区二区| 成人亚洲视频在线观看| 黑人巨大精品| 欧美伊人久久久久久午夜久久久久| 成人观看免费完整观看| 欧美日韩123区| 欧美中文字幕久久| 激情视频免费网站| 亚洲精品成a人ⅴ香蕉片| 欧美日韩高清一区| 伊人五月天婷婷| 亚洲第一二区| 亚洲黄色www网站| 97人妻天天摸天天爽天天| 日韩美女毛片| 一区二区亚洲欧洲国产日韩| 精品手机在线视频| 一区二区电影| 欧美精品www| 美日韩一二三区| 亚洲影院免费| 国产日韩在线视频| 国产福利小视频| av成人老司机| 色噜噜狠狠色综合网| 午夜伦全在线观看| 一区二区三区四区乱视频| 九一国产精品视频| 另类激情视频| 69久久99精品久久久久婷婷| 国产性猛交96| 国内精品视频在线观看| 久久午夜a级毛片| 国产亚洲精品久久久久久无几年桃 | 精品久久免费视频| 日本不卡一二三区黄网| 91成人免费在线观看| 亚洲色图狠狠干| 国产精品久久久久婷婷| 青青青在线观看视频| 成人爽a毛片免费啪啪| 欧美精品xxxxbbbb| 亚洲精品乱码久久| 日韩大片在线观看| 91精品国产91久久久久福利| 艳妇乳肉豪妇荡乳av无码福利| 国产美女精品人人做人人爽 | 欧美高清精品一区二区| 亚洲小说图片视频| 插插插亚洲综合网| 四虎影院在线免费播放| 国产成人欧美日韩在线电影| 日本一区二区三区四区高清视频 | 精品动漫一区二区| 亚洲精品性视频| 秋霞在线一区| 欧美精品一区在线播放| 国产在线观看第一页| 成人av免费在线播放| 在线观看欧美激情| 亚洲成人激情社区| 亚洲韩国青草视频| 九九热这里有精品视频| 日本不卡一区二区| 久久精品国产综合精品| 四季久久免费一区二区三区四区| 欧美性色aⅴ视频一区日韩精品| 成年女人免费视频| 亚洲最新色图| 国产视频观看一区| 国产在线你懂得| 精品福利在线视频| 国产调教打屁股xxxx网站| 欧美韩国日本在线观看| 国产精品video| 香港一级纯黄大片| 午夜精品福利在线| www.欧美com| 亚洲综合中文| 亚洲自拍偷拍第一页| 日本最黄一级片免费在线| 欧美午夜影院一区| 在线观看国产精品一区| 久久精品主播| 欧美二区三区在线| 自拍网站在线观看| 亚洲精品美女免费| 日本天堂网在线| 91在线小视频| 日韩av一二三四区| 日日天天久久| 日本免费在线精品| 欧美色图另类| 日本道免费精品一区二区三区| 青青草成人免费视频| 亚洲一区二区三区高清| 久久99久久99精品蜜柚传媒| 涩涩视频在线播放| 亚洲欧美中文在线视频| aaa在线视频| 国产蜜臀97一区二区三区| 九九视频精品在线观看| 不卡在线一区| 91亚洲精品一区| 羞羞的视频在线观看| 精品国产亚洲一区二区三区在线观看 | 亚洲综合福利| 日本不卡免费高清视频| 国产在线电影| 欧美狂野另类xxxxoooo| 成人免费黄色小视频| 粉嫩13p一区二区三区| 日韩人妻无码精品久久久不卡| 久久免费视频66| 日本久久久久久久| 日本www在线观看| 日韩一区二区三区三四区视频在线观看| 国产女人被狂躁到高潮小说| 国产 欧美在线| 黄在线观看网站| 日韩精品一卡| 成人做爰66片免费看网站| 玖玖在线播放| 色噜噜国产精品视频一区二区 | 男女视频免费看| 久久亚洲一级片| 黄色小视频免费网站| 欧美体内she精视频在线观看| 精品伦精品一区二区三区视频 | 亚洲一区区二区| 视频一区国产精品| 玖玖玖视频精品| 4438全国亚洲精品在线观看视频| 97人人在线| 亚洲福利视频专区| 中文有码在线播放| 亚洲制服欧美中文字幕中文字幕| 麻豆精品免费视频| 国产精品主播直播| 久久久久久香蕉| 欧美日韩国产欧| 日本精品国语自产拍在线观看| 99er精品视频| 日本精品久久久久影院| a免费在线观看| 亚洲欧美日韩另类| 亚洲h视频在线观看| 日本高清不卡在线观看| 精品肉丝脚一区二区三区| 中文子幕无线码一区tr| 国产一线在线观看| 麻豆精品国产传媒mv男同| 欧美精品卡一卡二| 香蕉av一区二区| 欧美影视一区二区| 成人自拍在线| 成人在线精品视频| 91av亚洲| 午夜精品久久久久久久久久久久| 亚洲精品传媒| 亚洲国产91色在线| 国产成人精品亚洲精品色欲| 在线日韩国产精品| 国产原创视频在线| 性欧美疯狂xxxxbbbb| 日韩欧美123区| 中文无字幕一区二区三区| 亚洲欧美日本一区| 成人一级视频在线观看| 男人午夜视频在线观看| 日韩精品国产精品| 大肉大捧一进一出好爽动态图| 欧美精品入口| 精品91一区二区三区| 成人毛片免费看| 欧美一区激情视频在线观看| 色天天色综合| 精品免费一区二区三区蜜桃| 亚洲精品观看| 91国产在线播放| 精品国模一区二区三区欧美 | 国产精品主播在线观看| 亚洲aa在线观看| 欧美大片网站| 国产区精品视频| 成人在线免费av| 国产精品视频区1| 亚洲成人av观看| 国产精品久久9| 日韩av首页| 国产精品观看在线亚洲人成网| 在线观看v片| 亲子乱一区二区三区电影| 亚洲优女在线| 日本国产一区二区三区| 亚洲欧洲自拍| 欧美综合国产精品久久丁香| 深夜成人在线| 奇米成人av国产一区二区三区| 在线女人免费视频| 欧美在线一级va免费观看| 女海盗2成人h版中文字幕| 2020久久国产精品| 亚洲精品一级二级| 国产精品欧美日韩一区二区| 国产69精品久久久久9999人| 国产精品在线看| 国产精品国产三级在线观看| 91亚色免费| 日本中文字幕在线一区| 日韩成人av电影在线| 久久密一区二区三区| 免费观看黄色大片| 国产一区日韩欧美| 成人在线免费观看av| 久久亚洲风情| 成年网站免费在线观看| 丁香婷婷综合色啪| 亚洲最大成人网站| 国产精品网站一区| 精品欧美一区二区久久久久| 亚洲国产日韩综合久久精品| 欧美啪啪小视频| 欧美日韩电影在线播放| 亚洲老妇色熟女老太| 亚洲男人第一网站| 黄色大片在线播放| 久久久在线观看| 亚洲成人看片| 亚洲精品免费在线视频| 美女视频免费精品| 亚洲国产欧洲综合997久久| 久久久久久久久丰满| 国产免费黄色小视频| 日本视频中文字幕一区二区三区| 天天久久综合网| 99久久久国产精品免费蜜臀| 刘亦菲国产毛片bd| 午夜精品福利在线| 国产绿帽一区二区三区| 日韩精品欧美国产精品忘忧草| 日韩美女网站| 8x海外华人永久免费日韩内陆视频| a成人v在线| 精品综合久久| 91av精品| 亚洲欧美另类动漫| 丁香天五香天堂综合| 99国产精品免费| 狠狠做深爱婷婷久久综合一区| 国产又黄又大又粗的视频| 亚洲精品不卡在线| av免费在线网站| 国产精品看片资源| 欧美做受69| 国产午夜精品视频一区二区三区| 日韩国产精品91| 无码精品一区二区三区在线播放| **欧美大码日韩| 正在播放亚洲精品| 精品视频在线播放| 男女在线观看视频| 成人午夜在线观看| 成人aaaa| 成人在线观看黄| 99久久免费视频.com| 欧美日韩亚洲国产另类| 欧美日产国产精品| 国产玉足榨精视频在线观看| 91av视频在线免费观看| 亚洲网一区二区三区| 男女h黄动漫啪啪无遮挡软件| 日韩电影免费一区| 亚洲国产av一区| 精品人伦一区二区三区蜜桃网站 | 日韩中文字幕精品| 成人va天堂| 欧美日韩国产综合在线| 亚洲激情一区| 亚洲av无码一区东京热久久| 一区二区三区日韩| 99国产精品99| 两个人的视频www国产精品| 亚洲图片小说区| 欧美日韩一级在线| 精品亚洲porn| 久久精品亚洲a| 91麻豆精品国产91久久久久久| 日韩专区在线| 成人有码在线播放| 亚洲欧洲中文字幕| 在线观看网站黄| 亚洲自拍另类综合| 内射无码专区久久亚洲| 久久久久久久久久婷婷| 国产欧美一区二区三区米奇| 国产一区二区三区小说| caoporm超碰国产精品| 国产午夜小视频| 日韩精品视频在线观看免费| 色偷偷偷在线视频播放| 欧美精品国产精品久久久| 视频一区中文字幕| 亚洲欧美日韩第一页| 欧美精品自拍偷拍| 在线看福利影| 国产福利久久| 蜜桃av一区| 欧美三级视频网站| 欧美久久久久久蜜桃| 日本欧美电影在线观看| 加勒比在线一区二区三区观看| 亚洲一区黄色| 超碰97av在线| 欧美一级国产精品| 国产精品无码网站| 国产在线高潮| 日本视频久久久| 欧美三级美国一级| 高潮一区二区三区| 伊人性伊人情综合网| 天堂在线资源8| 国产精品999| 欧美3p视频| 国产大尺度视频| 色综合久久综合中文综合网| 91caoporm在线视频| 91精品久久香蕉国产线看观看| 亚洲大胆在线| 成年人看的免费视频| 欧美不卡一区二区三区四区| 日本不卡网站| 亚洲一区免费看| 成人精品免费视频| 欧美成人精品网站| 欧美精品做受xxx性少妇| 日韩av资源网| 免费精品99久久国产综合精品应用| 一区二区三区国产精品| 精品成人一区二区三区免费视频| 91精品啪aⅴ在线观看国产| 尤物网精品视频| 女同久久另类69精品国产| 亚洲国内精品视频| 91成人在线网站| 黄www在线观看| 尤物视频一区二区| 成人免费高清在线播放| 国产欧美一区二区视频| 精品一区二区三区免费播放|