程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 通過WCF引用ListData.svc查詢,更新數據

通過WCF引用ListData.svc查詢,更新數據

編輯:關於.NET

SharePoint 2010自帶了一個開箱即用的WCF服務——ListData。本博文中,我們將一步一步的學習如何使用ListData.svc.

准備工作

創建一個網站,包含兩個列表,分別是 客戶和城市。為列表填寫一些列表項。客戶列表應包含一個名為城市的欄,作為查閱項關聯到城市列表。

城市列表:

客戶列表:

創建一個控制台應用程序(實際上什麼類型的程序都無所謂),添加一個引用到WCF服務:

注意:在本例中我把引用命名為ListDataService。ListData服務位於虛擬目錄/_vti_bin/listdata.svc

開始使用

現在,我們的引用已經建立好了,你需要對其進行實例化。在本例中,我使用了一個全局靜態成員變量,以便稍後再其他方法中調用:

static ListDataService.工作組網站DataContext Ctx = null;
static void Main(string[] args)
{
     Ctx = new ListDataService.工作組網站DataContext(new Uri("http://sp2010u/it/_vti_bin/listdata.svc"));
     Ctx.Credentials = System.Net.CredentialCache.DefaultCredentials;

接下來,你就可以開始查詢數據了:

static void ListCustomerAndCityDetails()
{
     var CustomerResults = (from Customer in Ctx.客戶
                             where Customer.城市 != null && Customer.城市.國家 != null
                             select new
                             {
                                 CustomerName=Customer.客戶,
                                 CityName=Customer.城市.城市,
                                 CountryName=Customer.城市.國家
                             });
     foreach (var CustomerResult in CustomerResults)
     {
         Console.WriteLine("客戶 {0} 生活在 {2} 的 {1}",
             CustomerResult.CustomerName,
             CustomerResult.CityName,
             CustomerResult.CountryName);
     }
}
static void ListCustomers()
{
     var CustomerResults = (from Customer in Ctx.客戶
                             select Customer);
     foreach (var CustomerResult in CustomerResults)
     {
         Console.WriteLine("{1} - 客戶 {0}", CustomerResult.客戶,CustomerResult.Id);
     }
}

你也可以執行寫操作,比如添加數據:

static void AddCustomer(string cityname, string customername)
{
     var CustomerCity = Ctx.城市.Where(v => v.城市 == cityname).FirstOrDefault();
     if (CustomerCity == null)
     {
         CustomerCity = BuildNewCity(cityname);
     }
     ListDataService.客戶Item Client = new ListDataService.客戶Item();
     Client.城市Id = CustomerCity.Id;
     Client.城市 = CustomerCity;
     Client.客戶 = customername;
     Ctx.AddTo客戶(Client);
     Ctx.SaveChanges();
}

調用類似AddTo實體名的方法和SaveChanges()方法就可以完成新建列表項的操作。

刪除數據:

static void DeleteCustomer(int IdClient)
{
     try
     {
         Ctx.DeleteObject(Ctx.客戶.Where(c => c.Id == IdClient).FirstOrDefault());
         Ctx.SaveChanges();
     }
     catch (DataServiceQueryException)
     {
         Console.WriteLine("找不到該客戶!");
     }
}

調用DataServiceContext的DeleteObject和SaveChanges方法就可以完成刪除指定項的操作。

接下來是更新數據:

static void ModifyCustomerSetNewCity(int idclient, string newcity)
{
     var TargetCustomer = Ctx.客戶.Where(c => c.Id == idclient).FirstOrDefault();
     if (TargetCustomer == null)
         throw new ApplicationException("目標客戶不存在!");
     var CustomerCity = Ctx.城市.Where(v => v.城市 == newcity).FirstOrDefault();
     if (CustomerCity == null)
     {
         CustomerCity = BuildNewCity(newcity);
     }
     TargetCustomer.城市 = CustomerCity;
     TargetCustomer.城市Id = CustomerCity.Id;
     Ctx.UpdateObject(TargetCustomer);
     Ctx.SaveChanges();
}
private static ListDataService.城市Item BuildNewCity(string cityname)
{
     ListDataService.城市Item NewCity = new ListDataService.城市Item()
     {
         城市 = cityname
     };
     Ctx.AddTo城市(NewCity);
     Ctx.SaveChanges();
     return Ctx.城市.Where(v => v.城市 == cityname).FirstOrDefault();
}

這裡你需要在調用SaveChanges前調用UpdateObject 方法。其中,你可能已經注意到了,給查閱項設置值時,你必須同時指定查閱項本身的值和一個查閱項 ID。本例中是Client.City和Client.CityID。如果在SPLINQ中就不用這樣了...

ListCustomerAndCityDetails的執行結果:

通過Fiddler查看一下這個查詢對應的類REST HTTP請求,如下圖所示:

其中的GET部分為:

http://sp2010u/it/_vti_bin/listdata.svc/%E5%AE%A2%E6%88%B7()?$filter=(%E5%9F%8E%E5%B8%82%20ne%20null)%20and%20(%E5%9F%8E%E5%B8%82/%E5%9B%BD%E5%AE%B6%20ne%20null)&$expand=%E5%9F%8E%E5%B8%82&$select=%E5%AE%A2%E6%88%B7,%E5%9F%8E%E5%B8%82/%E5%9F%8E%E5%B8%82,%E5%9F%8E%E5%B8%82/%E5%9B%BD%E5%AE%B6 

進行一下UTF-8轉碼後:

http://sp2010u/it/_vti_bin/listdata.svc/客戶()?$filter=(城市 ne null) and (城市/國家 ne null)&$expand=城市&$select=客戶,城市/城市,城市/國家 

注意到,filter指定了獲取客戶數據的查詢條件,expand指定了還需要從城市列表中獲取數據。語法很簡單,我們可以方便的在自己的代碼中生成類似的查詢url。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved