熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Linq To Sql常用方法使用總結

2022-06-13   來源: .NET編程 

  准備工作

  數據表

  Table

  ID        int        PK

  Col        varchar()

  Col        int

  ======================================

  Table

  ID        int        PK

  oID        int        FK

  Remarks        varchar()

  ======================================

  方法簡介

      查詢

  DBContext dc = new DBContext();              //實例化Linq To SQL 類

  var s = from t in dcTable

  select t;

  s就是表Table中所有的集合

  如果需要返回Table中的某幾列

  var s = from t in dcTable

  select new

  {

  tID

  tCol

  };

  這樣就只返回ID列和Col

  如果要給返回的列指定別名寫法如下

  var s = from t in dcTable

  select new

  {

  myID = tID

  myCol = tCol

  };

  這就相當於SQL語句中的 select ID as myID Col as myCol from Table

      帶條件查詢

  查詢Table中Col列的值等於 ABC的所有記錄

  DBContext dc = new DBContext();

  var s = from t in dcTable

  where tCol==ABC    //或者 where tColEquals(ABC)模糊查詢用where tCol Contains (ABC) 相當於SQL語句中的 like %ABC%

  select t;

  還有一種更簡單的方法

  var s = dcTableWhere(u=>uColEquals(ABC));

  在vs已經將所有容器(數組)都封閉了如上方法類似的還有

  var s = dcTableFirst()    //取第一條數據

  var s = dcTableLast()    //取最後一條數據

  但是這樣寫必需注意異常處理比如取第一條數據時如果表Table中根本就沒有任何數據則該語句會直接出錯

  所以要麼先判斷表中的數據條數要麼加try…catch…進行處理

      數據總數

  DBContent dc = new DBContent();

  var s = from t in dcTable

  select new

  {

  tID    //為了速度更快點所以只返回一列

  };

  sCount();    //這裡就是數據總條數

  還有一種更簡單的方法

  int totailNo = dcTableCount();    //這裡的Count()裡面同樣可以加條件(u=>uColEquals(ABC))

      兩表聯合查詢(及左鏈接)

  DBContent dc = new DBContent();

  var s = from t in dcTable

  join t in dcTable

  on tID equals toID          //注用了join on後面必需用 equals

  select new

  {

  TID

  TCol

  T Remarks

  };

  左鏈接

  var s = from t in dcTable

  join t in dcTable

  on t ID equals toID into tempT

  from t in tempTDefaultIfEmpty()

  select ……

  Linq中的左連接(或右連接)就是使用DefaultIfEmpty()語法但是使用DefaultIfEmpty()也需要用到into語法如上例所示在語句執行過後t是已經不存在了因為它已經將數據轉移到tempT中了而tempT也不存在了同樣是因為通過DefaultIfEmpty()語法將數據轉移到t中了

      Group by 語法

  var result = from t in dcTable

  group t by tID into tempT    //這一步已經不存在 t 了 而 t 中的數據都到 tempT中了(數據是沒移動的)

  select new

  {

  objID = tempTKey

  myCol = tsMax(p => p Col)

  };

  在Linq 中使用group by 就必需使用into(也就是將group by 以後的數據放到一個新的容器中)另外值得注意的是例子中的 objID= tempTKey這裡也可以看出是使用的tempT而不是t說明通過group by…into… 已經將查詢出來的結果放進了tempT中而tempTKey就是 group by 後面的tID

      分頁

  var s = from t in ctbTests

  order by tID    //分頁都需要用到order by 還將可能引起返回的數據不准確

  select new

  {

  myID = tID

  myCol = tCol

  };

  GridViewDataSource = sSkip(startRowIndex)Take(rowCount);

  GridViewDataBind();

  startRowIndex當前數據頁數的第一條數據

  rowCount:每頁顯示的數據條數

  比如

  頁數用 pageIndex表示

  當前是第一頁(pageIndex=; startRowIndex=)

  每頁顯示條數據(rowCount=)

  那麼我們顯示下一頁數據時pageIndex=;startRowIndex就應該是(startRowIndex * RowCount)

      多條件動態查詢

  首先得寫一個類(用於加載動態條件的)

  /// <summary>

  /// 生成多條件動態查詢的條件結構 : AND用true ; OR用false

  /// </summary>

  public static class PredicateExtensions

  {

  public static Expression<Func<T bool>> True<T>() { return f => true; }

  public static Expression<Func<T bool>> False<T>() { return f => false; }

  public static Expression<Func<T bool>> Or<T>(this Expression<Func<T bool>> expr Expression<Func<T bool>> expr)

  {

  var invokedExpr = ExpressionInvoke(expr exprParametersCast<Expression>());

  return ExpressionLambda<Func<T bool>>(ExpressionOr(exprBody invokedExpr) exprParameters);

  }

  public static Expression<Func<T bool>> And<T>(this Expression<Func<T bool>> expr Expression<Func<T bool>> expr)

  {

  var invokedExpr = ExpressionInvoke(expr exprParametersCast<Expression>());

  return ExpressionLambda<Func<T bool>>(ExpressionAnd(exprBody invokedExpr) exprParameters);

  }

  }

  上面這部分是一個老外寫的嘿嘿

  下面進行動態查詢

  var searchPredicate = PredicateExtensionsTrue<Table>();

  string col = textBoxText;

  int col = intPrase(textBoxText);

  if (!stringIsNullOrEmpty(col))

  {

  searchPredicate = searchPredicateAnd(u => uColContains(col));

  }

  if(col != )

  {

  searchPredicate = searchPredicateAnd(u => uColEquals(col));

  }

  DBContent dc = new DBContent();

  var s = from t in dcTableWhere(searchPredicate)

  select t;

      查詢出來的數據再查詢

  DBContent dc = new DBContent();

  var s = from t in dcTable

  select t;

  var q = from t in dcTable

  join t in s          //這裡是將查詢的數據 s 再進行查詢

  on toID equals tID

  select ……

      外部數據作中條件檢索

  int[] colList = new int[] {};

  DBContent dc = new DBContent();

  var s = from t in dcTableWhere(u=>colListContains(uCol))    //查詢列Col的值包含在colList中的數據(和 in 語法差不多)

  select t;


From:http://tw.wingwit.com/Article/program/net/201311/11336.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.