[ASP.NET][LINQ] 基本LINQ語法介紹

摘要:[ASP.NET][LINQ] 基本LINQ語法介紹

前言


  之前有稍為使用LINQ,順手將使用的方式紀錄,在記錄之前先稍為介紹一下LINQ,引用MSDN描述:

Language-Integrated Query (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中的突破性創舉,它填補了物件與資料之間的差距。

傳統上,資料查詢是以簡單的字串表示,既不會在編譯時期進行型別檢查,也不支援 IntelliSense。此外,您還必須針對每種資料來源學習不同的查詢語言:SQL 資料庫、XML 文件、各種 Web 服務等等。LINQ 將「查詢」(Query) 變成 C# 和 Visual Basic 中第一級的語言建構。只要使用語言關鍵字和您熟悉的運算子,就可以針對強型別的物件集合撰寫查詢。

 

  在我還沒使用LINQ之前,我都是使用DataTable.Select的方式處理程式面塞選資料的動作,但在我使用LINQ之後,發現的確LINQ是個好東西,能夠更加靈活的針對資料塞選應用。

  LINQ 大致分為以下幾種:

 

  基本上我常使用到的是 LINQ to DataSet,因為都是先使用ADO.NET將資料撈出至DataSet後在做進階塞選,所以下面的範例語法以操作DataSet為主,補充 LINQPad 這個工具可以提供你將LINQ語法執行並可以看到結果,是個還不錯的補助工具。

 

範例


無條件查詢


// 無條件查詢
var result = from q in mydt.AsEnumerable()
             select q;

// 防止NULL值
if (result.FirstOrDefault<DataRow>() != null)
{
    DataTable dt = result.CopyToDataTable<DataRow>();
    foreach (DataRow dr in dt.Rows)
    {
        Response.Write(
            string.Format("{0} - {1} - {2} - {3}",
            dr["Id"].ToString(),
            dr["Name"].ToString(),
            dr["Age"].ToString(),
            dr["Sex"].ToString()));
    }
}

有條件查詢


// 有條件查詢
var result = from q in mydt.AsEnumerable()
              where q.Field<int>("Age") > 30
              select new UserInfo()
              {
                  Id = q.Field<int>("Id"),
                  Name = q.Field<string>("Name"),
                  Age = q.Field<int>("Age"),
                  Sex = q.Field<int>("Sex")
              };

foreach (UserInfo info in result)
{
    Response.Write(string.Format("{0} - {1} - {2} - {3}",
                info.Id, info.Name, info.Age, info.Sex));
}

COUNT


string str = "ABCDDEAEDAAWQ";
char[] chars = str.ToCharArray();

int q = (from i in chars
         where i == 'A'
         select i).Count();
Console.WriteLine(q.ToString());

int v = chars.Where(p => p == 'A').Count();
Console.WriteLine(v.ToString());

Console.ReadLine();

 

TOP


// 有條件查詢TOP5
var result = (from q in mydt.AsEnumerable()
             where q.Field<int>("Age") > 30
             select new UserInfo()
             {
                 Id = q.Field<int>("Id"),
                 Name = q.Field<string>("Name"),
                 Age = q.Field<int>("Age"),
                 Sex = q.Field<int>("Sex")
             }).Take(5);

foreach (UserInfo info in result)
{
    Response.Write(string.Format("{0} - {1} - {2} - {3}",
        info.Id, info.Name, info.Age, info.Sex));
}

ORDER BY


// Order bBy
var result = (from q in mydt.AsEnumerable()
              where q.Field<int>("Age") > 30
              orderby q.Field<int>("Age")
              select new UserInfo()
              {
                  Id = q.Field<int>("Id"),
                  Name = q.Field<string>("Name"),
                  Age = q.Field<int>("Age"),
                  Sex = q.Field<int>("Sex")
              });

foreach (UserInfo info in result)
{
    Response.Write(string.Format("{0} - {1} - {2} - {3}",
        info.Id, info.Name, info.Age, info.Sex));
}

JOIN


// JOIN
var result = (from q in mydt.AsEnumerable()
              from j in mydt2.AsEnumerable()
              where q.Field<int>("Id") == j.Field("Pid")
              select new UserJob()
              {
                  Name = q.Field<string>("Name"),
                  Job = j.Field<string>("Job")
              });

foreach (UserJob info in result)
{
    Response.Write(string.Format("{0} - {1}",
        info.Name, info.Job));
}

IN


// IN
string[] names = { "TTName2", "TTName5", "TTName8", "TTName15" };
var result = (from q in mydt.AsEnumerable()
              where names.Contains(q.Field("Name"))
              orderby q.Field<int>("Age")
              select new UserInfo()
              {
                  Id = q.Field<int>("Id"),
                  Name = q.Field<string>("Name"),
                  Age = q.Field<int>("Age"),
                  Sex = q.Field<int>("Sex")
              });

foreach (UserInfo info in result)
{
    Response.Write(string.Format("{0} - {1} - {2} - {3}",
        info.Id, info.Name, info.Age, info.Sex));
} 

NOT IN


// NOT IN
string[] names = { "TTName1", "TTName2", "TTName3", "TTName4" };
var result = (from q in mydt.AsEnumerable()
              where !names.Contains(q.Field("Name"))
              orderby q.Field<int>("Age")
              select new UserInfo()
              {
                  Id = q.Field<int>("Id"),
                  Name = q.Field<string>("Name"),
                  Age = q.Field<int>("Age"),
                  Sex = q.Field<int>("Sex")
              });

foreach (UserInfo info in result)
{
    Response.Write(string.Format("{0} - {1} - {2} - {3}",
        info.Id, info.Name, info.Age, info.Sex));
}

 

  未完,之後再繼續補充。

 

範例程式


TLINQ.rar

 

參考資料


http://msdn.microsoft.com/zh-tw/library/bb397897(v=vs.90).aspx

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)