使用LINQ to SQL時,需要首先建立用於映射數據庫對象的模型,也就是實體類。在運行時,LINQ to SQL 根據LINQ表達式或查詢運算符生成SQL語句,發送到數據庫進行操作。數據庫返回後,LINQ to SQL負責將結果轉換成實體類對象。
建立實體類的方法有很多,例如LINQ to SQL設計器,手動編碼建立,使用XML文件映射,使用命令行工具SqlMetal生成等。其中最方便的就是LINQ to SQL設計器。
在一個示例用的Demo控制台程序中添加一個“基於服務的數據庫”Database1.mdf,建立一張tb_GuestInfo的表。該表的詳細如下:

下面的所有建立方式,都用的這個數據庫。
在項目中添加一個LINQ to SQL類,采用默認的名稱DataClasses1.dbml,如下:

將tb_GuestInfo表拖到界面上,保存。

OK,編寫相關代碼如下,實現增刪改查:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQ_To_SQL自定義數據庫和實體類
{
/// <summary>
/// 實體類的建立___1.VS建立實體類
/// </summary>
class Program
{
static void Main(string[] args)
{
//
DataClasses1DataContext dc = new DataClasses1DataContext();
//1.查詢
IQueryable<tb_GuestInfo> query = from p in dc.tb_GuestInfo
where p.Name != "XXX"
select p;
foreach (var g in query)
{
Console.WriteLine("{0} {1} {2} {3}",g.Id,g.Name,g.Age ,g.Tel );
}
Console.WriteLine("-----------------");
Console.ReadKey(false);
//2.增加一條記錄
tb_GuestInfo gInfo = new tb_GuestInfo() { Id = 9, Name = "M&M", Age = 40, Tel = "135****5555" };
dc.tb_GuestInfo.InsertOnSubmit(gInfo);
dc.SubmitChanges();
foreach (var g in query)
{
Console.WriteLine("{0} {1} {2} {3}",g.Id , g.Name, g.Age, g.Tel);
}
Console.WriteLine("-----------------");
Console.ReadKey(false);
//3.刪除
var query_itemToDelete = from g in dc.tb_GuestInfo
where g.Name == "M&M"
select g;
foreach (var g in query_itemToDelete)
{
dc.tb_GuestInfo.DeleteOnSubmit(g);
}
dc.SubmitChanges();
foreach (var g in query)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("-----------------");
Console.ReadKey(false);
//4.修改
var query_itemToUpdate = from g in dc.tb_GuestInfo
where g.Name.Contains("DebugLZQ")
select g;
foreach (var g in query_itemToUpdate)
{
g.Name = g.Name + "A";
}
dc.SubmitChanges();
foreach (var g in query)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("-----------------");
Console.ReadKey(false);
}
}
}
程序運行結果如下:

實體類在多數情況下可以通過LINQ to SQL類設計器建立,當然動手建立一個簡單的實體類也不是難事,並且可以更好的學習LINQ to SQL的對象模型。數據庫依然是前面的示例數據庫。
在項目中添加一個類GuestInfoEntity.cs,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;
namespace DataContexDemo
{
/// <summary>
/// 手動建立實體類
/// </summary>
[Table(Name="tb_GuestInfo")]
class GuestInfoEntity
{
[Column(IsPrimaryKey=true,DbType="Int NOT NULL IDENTITY",IsDbGenerated=true,Name="Id")]
public int ID { get; set; }
[Column(DbType = "nvarchar(20)", Name = "Name")]
public string Name{get;set;}
[Column(DbType = "int", Name = "Age")]
public int Age { get; set; }
[Column(DbType = "nvarchar(20)", Name = "Tel")]
public string Tel { get; set; }
}
}
編寫示例代碼,注意需要引入System.Data.Linq.dll:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;//關注
namespace DataContexDemo
{
class Program
{
static void Main(string[] args)
{
//2.手動建立實體類
//
//連接字符串
string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數據庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True";
DataContext dc = new DataContext(constring);
Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>();
var query = tb.AsEnumerable();
foreach (var q in query)
{
Console.WriteLine("{0} {1} {2} {3}",q.ID,q.Name,q.Age,q.Tel );
}
Console.ReadKey();
}
}
}
程序運行如下:

實體類的映射除了使用內聯Attribute外,還可以建立一個包含映射信息的XML文件,此文件生成System.Data.Linq.Mapping.XmlMappingSource對象,作為DataContext對象構造方法的參數。
這個XML文件只有一個根節點---Database元素,用來映射的數據庫信息。Database元素包含一個或多個Table元素,用於映射數 據庫表的信息,Table元素由一個Type元素和多個Column元素(或Association元素)組成。Type元素用來指定實體 類,Column元素用來指定列信息,Association元素用來映射數據庫關系。
在項目中添加一個XML文件,采用默認名稱XMLFile1.xml,內容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Database Name="Database1" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"><!--數據庫名稱可隨意;名稱空間一定要加上-->
<Table Name="tb_GuestInfo"><!--數據庫中表的名稱-->
<Type Name="LINQtoSQL建立實體類_XML.GuestInfoEntity"><!--太BT了,居然要全名;GuestInfoEntity居然不行-->
<Column Name="Id" Member="ID" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true"/>
<Column Name="Name" Member="Name" DbType="nvarchar(20)" />
<Column Name="Age" Member="Age" DbType="int" />
<Column Name="Tel" Member="Tel" DbType="nvarchar(20)" />
</Type>
</Table>
</Database>
這個XML文件包含類全部的映射信息,下面建立映射的類GuestInfoEntity.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQtoSQL建立實體類_XML
{
public class GuestInfoEntity
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Tel { get; set; }
}
}
編寫示例代碼,同樣需要引入System.Data.Linq.dll:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.IO;//
namespace LINQtoSQL建立實體類_XML
{
class Program
{
static void Main(string[] args)
{
string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數據庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True";
XmlMappingSource map = XmlMappingSource.FromXml(File.ReadAllText("XMLFile1.xml"));
DataContext dc = new DataContext(constring, map);
Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>();
var query = tb.AsEnumerable();
foreach (var g in query)
{
Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel );
}
Console.ReadKey();
}
}
}
程序的運行如下:

我畢業的個人項目也是用linq to sql 做的,只建個了UI層,BLL業務邏輯層(類庫),DateLinq類庫(裡面只有一個linq to sql 的文件),數據訪問層DAL就不要再寫了,前面兩個都引用DateLinq,BLL做數據的增刪查改,實體類直接用linq的映射表,也可以自己寫要加上特性;這是最簡單的也沒有用設計模式,感覺用linq to sql 在分個三層有些多此一舉。當然還是可以像用T-SQL數據訪問那樣寫的,個人認為沒必要。
贊同前面的答案用代碼生成器不管是哪個層都可以分分鐘搞定
