摘要:[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 大致分為以下幾種:
- SQL Server 資料庫:LINQ to SQL
- XML 文件:LINQ to XML
- ADO.NET Dataset:LINQ to DataSet
- .NET 集合、檔案、字串等等:LINQ to Objects
基本上我常使用到的是 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));
}
未完,之後再繼續補充。
範例程式
參考資料
http://msdn.microsoft.com/zh-tw/library/bb397897(v=vs.90).aspx
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)