SlideShare una empresa de Scribd logo
1 de 42
Descargar para leer sin conexión
SharePoint, LINQ иOpen Data Protocol,[object Object],Vitaly Baum,[object Object],Senior SharePoint Developer @ Conteq ,[object Object],Активный участник групп разработчиков в Санкт-Петербурге и Москве, подкастер и блоггер,[object Object],http://butaji.ru,[object Object]
План выступления,[object Object],LINQ to SharePoint 2010,[object Object],Open Data Protocol,[object Object]
LINQ to SharePoint,[object Object]
Преимущества LINQ,[object Object],Строгая типизация,[object Object],Запросы к реляционным данным в строго-типизированной форме,[object Object],Компилятор проверит ошибки в запросах,[object Object],IntelliSense,[object Object],Унифицированный путь получения данных из любого источника,[object Object]
LINQ to SharePoint,[object Object],SPMetal,[object Object],Генерирует DataContext,[object Object],SPMetal /web:http://ContosoServer/Marketing /code:MarketingSite.cs ,[object Object]
LINQ to SharePoint,[object Object],Недостатки,[object Object],Преобразуется в CAML,[object Object],Не все операторы реализованы,[object Object],Двухэтапные запросы,[object Object],Аггрегирующие запросы,[object Object],SPSiteDataQuery,[object Object]
Mapping,[object Object],internal partial class OrganisationSiteDataContext     : Microsoft.SharePoint.Linq.DataContext{},[object Object],[ContentType(Name = "Employee")],[object Object],public partial class Employee,[object Object],{    ,[object Object],[Column(Name="ID", IsId=true, ReadOnly=true, FieldType="Counter")]    ,[object Object],public int Id {get; set;},[object Object],},[object Object]
ICostumMapping,[object Object],public partial class Project : ICustomMapping,[object Object],{   ,[object Object],[CustomMapping(Columns = new String[] { «Due_x0020_Date», «IsCancelled» })]   ,[object Object],public void MapFrom(object listItem)   ,[object Object],{        ,[object Object],this.DueDate= ((SPListItem)listItem)[“Due_x0020_Date”];        this.IsCancelled = ((SPListItem)listItem)[“IsCancelled”];   ,[object Object],}   ,[object Object],public void MapTo(object listItem)   ,[object Object],{       ,[object Object],((SPListItem)listItem)[“Due_x0020_Date”] = this.DueDate;       ((SPListItem)listItem)[“IsCancelled”] = this.IsCancelled;   ,[object Object],}    ,[object Object],public void Resolve(RefreshMode mode, object originalListItem, object databaseObject),[object Object],{    },[object Object],},[object Object]
SPMetal,[object Object],ImtechSPMetalDefinition Extension,[object Object]
LINQ to SharePoint,[object Object],Демо,[object Object]
SharePoint, LINQ, OData
Open Data Protocol,[object Object],Открытый доступ к данным,[object Object],Открытыеформаты данных,[object Object],Унифицированная форма запросов,[object Object]
Open Data Protocol,[object Object],Открытый доступ к данным,[object Object],HTTP,[object Object],Открытыеформаты данных,[object Object],AtomPub, JSON,[object Object],Унифицированная форма запросов,[object Object],LINQ,[object Object]
Open Data Protocol,[object Object],Уровень абстракции,[object Object],Широкого доступа,[object Object],Унифицированного доступа,[object Object],Простого доступа,[object Object]
Open Data Protocol,[object Object],Потребители,[object Object],Браузеры,[object Object],OData Explorer,[object Object],Excel 2010 (PowerPivot),[object Object],LinQPad,[object Object],Visual Studio,[object Object],…,[object Object]
Open Data Protocol,[object Object],http://services.odata.org/OData/OData.svc/,[object Object],<service xml:base="http://services.odata.org/OData/OData.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app"> ,[object Object],  <workspace> ,[object Object],    <atom:title>Default</atom:title> ,[object Object],    <collection href="Products"> ,[object Object],      <atom:title>Products</atom:title> ,[object Object],    </collection> ,[object Object],    <collection href="Categories"> ,[object Object],      <atom:title>Categories</atom:title> ,[object Object],    </collection> ,[object Object],    <collection href="Suppliers"> ,[object Object],      <atom:title>Suppliers</atom:title> ,[object Object],    </collection> ,[object Object],  </workspace> ,[object Object],</service>,[object Object]
Open Data Protocol,[object Object],http://services.odata.org/OData/OData.svc/Products,[object Object],<?xml version="1.0" encoding="windows-1251" standalone="yes"?>,[object Object],<feed xml:base="http://services.odata.org/OData/OData.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">,[object Object],  <title type="text">Products</title>,[object Object],  <id>http://services.odata.org/OData/OData.svc/Products</id>,[object Object],  <updated>2010-07-01T20:01:57Z</updated>,[object Object],  <link rel="self" title="Products" href="Products" />,[object Object],  <entry>,[object Object],    <id>http://services.odata.org/OData/OData.svc/Products(0)</id>,[object Object],    <title type="text">Bread</title>,[object Object],    <summary type="text">Whole grain bread</summary>,[object Object],    <updated>2010-07-01T20:01:57Z</updated>,[object Object],    <author>,[object Object],      <name />,[object Object],    </author>…,[object Object]
Open Data Protocol,[object Object],http://services.odata.org/OData/OData.svc/Products(4),[object Object],<?xml version="1.0" encoding="windows-1251" standalone="yes"?>,[object Object],<entry xml:base="http://services.odata.org/OData/OData.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">,[object Object],  <id>http://services.odata.org/OData/OData.svc/Products(4)</id>,[object Object],  <title type="text">Fruit Punch</title>,[object Object],  <summary type="text">Mango flavor, 8.3 Ounce Cans (Pack of 24)</summary>,[object Object],  <updated>2010-07-01T20:03:37Z</updated>,[object Object],  <author>,[object Object],    <name />,[object Object],  </author>,[object Object],  <link rel="edit" title="Product" href="Products(4)" />,[object Object],  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category" type="application/atom+xml;type=entry" title="Category" href="Products(4)/Category" />,[object Object],  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier" type="application/atom+xml;type=entry" title="Supplier" href="Products(4)/Supplier" />,[object Object],  <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />,[object Object],  <content type="application/xml">,[object Object],    <m:properties>,[object Object],      <d:ID m:type="Edm.Int32">4</d:ID>,[object Object],      <d:ReleaseDate m:type="Edm.DateTime">2003-01-05T00:00:00</d:ReleaseDate>,[object Object],      <d:DiscontinuedDate m:type="Edm.DateTime" m:null="true" />,[object Object],      <d:Rating m:type="Edm.Int32">3</d:Rating>,[object Object],      <d:Price m:type="Edm.Decimal">22.99</d:Price>,[object Object],    </m:properties>,[object Object],  </content>,[object Object],</entry>,[object Object]
Open Data Protocol,[object Object],Типы данных,[object Object],Null,[object Object],Binary,[object Object],Boolean,[object Object],Byte,[object Object],DateTime,[object Object],Decimal,[object Object],Double,[object Object],Single,[object Object],Guid,[object Object],Int16, Int32, Int64,[object Object],Sbyte,[object Object],String,[object Object],Time,[object Object],DateTimeOffset,[object Object]
Open Data Protocol,[object Object],http://localhost:8080/owind.svc/Categories(2)/Products,[object Object],<feed xml:base="http://localhost:8080/owind.svc/" ...>,[object Object],  ...,[object Object],  <entry>,[object Object],  ...,[object Object],  <link rel="edit" title="Product" href="Products(3)" /> ,[object Object],  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category",[object Object],    type="application/atom+xml;type=entry" title="Category",[object Object],href="Products(3)/Category" /> ,[object Object],  <link,[object Object],rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details",[object Object],    type="application/atom+xml;type=feed" title="Order_Details",[object Object],href="Products(3)/Order_Details" /> ,[object Object],  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier",[object Object],    type="application/atom+xml;type=entry" title="Supplier",[object Object],href="Products(3)/Supplier" /> ,[object Object],  ...,[object Object],  <content type="application/xml">,[object Object],    <m:properties>,[object Object],      <d:ProductID m:type="Edm.Int32">3</d:ProductID> ,[object Object],      <d:ProductName>Aniseed Syrup</d:ProductName> ,[object Object],      ...,[object Object],    </m:properties>,[object Object],  </content>,[object Object],  </entry>,[object Object],  ...,[object Object],</feed>,[object Object]
Open Data Protocol,[object Object],http://localhost:8080/owind.svc/Categories(2)/Products,[object Object],<feed xml:base="http://localhost:8080/owind.svc/" ...>,[object Object],  ...,[object Object],  <entry>,[object Object],  ...,[object Object],  <link rel="edit" title="Product" href="Products(3)" /> ,[object Object],  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category",[object Object],    type="application/atom+xml;type=entry" title="Category",[object Object],href="Products(3)/Category" /> ,[object Object],  <link,[object Object],rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details",[object Object],    type="application/atom+xml;type=feed" title="Order_Details",[object Object],href="Products(3)/Order_Details" /> ,[object Object],  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier",[object Object],    type="application/atom+xml;type=entry" title="Supplier",[object Object],href="Products(3)/Supplier" /> ,[object Object],  ...,[object Object],  <content type="application/xml">,[object Object],    <m:properties>,[object Object],      <d:ProductID m:type="Edm.Int32">3</d:ProductID> ,[object Object],      <d:ProductName>Aniseed Syrup</d:ProductName> ,[object Object],      ...,[object Object],    </m:properties>,[object Object],  </content>,[object Object],  </entry>,[object Object],  ...,[object Object],</feed>,[object Object]
Open Data Protocol,[object Object],http://localhost:8080/owind.svc/Categories(2)/Description,[object Object],<Description xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">,[object Object],Sweet and savory sauces, relishes, spreads, and seasonings,[object Object],</Description>,[object Object]
Open Data Protocol,[object Object],http://localhost:8080/owind.svc/Categories(2)/Description/$value,[object Object],Sweet and savory sauces, relishes, spreads, and seasonings,[object Object]
Open Data Protocol,[object Object],http://localhost:8080/owind.svc/Categories/$count,[object Object],8,[object Object]
Open Data Protocol,[object Object],http://localhost:53211/owind.svc/Categories(4)/$links/Products,[object Object],<links xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices"> <uri>http://localhost:53211/owind.svc/Products(11)</uri> <uri>http://localhost:53211/owind.svc/Products(12)</uri> <uri>http://localhost:53211/owind.svc/Products(31)</uri> <uri>http://localhost:53211/owind.svc/Products(32)</uri> <uri>http://localhost:53211/owind.svc/Products(33)</uri> <uri>http://localhost:53211/owind.svc/Products(59)</uri> <uri>http://localhost:53211/owind.svc/Products(60)</uri> <uri>http://localhost:53211/owind.svc/Products(69)</uri> <uri>http://localhost:53211/owind.svc/Products(71)</uri> <uri>http://localhost:53211/owind.svc/Products(72)</uri> </links>,[object Object]
Open Data Protocol,[object Object],http://localhost:8080/owind.svc/Categories?$orderby=CategoryName desc&$top=4,[object Object],http://localhost:53211/owind.svc/Categories?$filter=(CategoryID add 4) eq8,[object Object],http://localhost:53211/owind.svc/Categories?$filter=startswith(CategoryName, 'Sea'),[object Object]
Open Data Protocol,[object Object],<html>,[object Object],<head>,[object Object],    <title>OData JSON Test</title>,[object Object],    <script src="/Scripts/jquery-1.3.2.js" type="text/javascript"></script>,[object Object],</head>,[object Object],<body>,[object Object],    <script type="text/javascript">,[object Object],        $(document).ready(function () {,[object Object],            $("#foo").text("fetching...");,[object Object],varurl = "http://localhost:8080/owind.svc/Categories/";,[object Object],            $.getJSON(url, function (result) {,[object Object],              $("#foo").text(result.d[0].CategoryName);,[object Object],            });,[object Object],        });,[object Object],    </script>,[object Object],    <p id="foo">loading page...</p>,[object Object],</body>,[object Object],</html>,[object Object]
Open Data Protocol,[object Object],Объявлять функции,[object Object],Выдавать данные в JSON,[object Object],Наслаждаться жизнью,[object Object]
Open Data Protocol,[object Object],Поставщики,[object Object],SharePoint 2010,[object Object],IBM WebSphere,[object Object],SQL Azure,[object Object],Azure Table Storage,[object Object],SQL Reporting Services,[object Object],…,[object Object]
Open Data Protocol,[object Object],Поставщики,[object Object],Facebook,[object Object],Netflix,[object Object],Pluralsight,[object Object],Stack Overflow,[object Object],Codename Dallas,[object Object],…,[object Object]
Browser, Visual Studio, Python,[object Object],Демо,[object Object]
Готовим OData,[object Object]
Готовим OData,[object Object],Парочка IQueryable<T>,[object Object],ADO.NET Data Services v1.5,[object Object],Немного желания,[object Object]
Готовим ODataEntity Framework, LINQ to SQL,[object Object],public class ProductService : DataService<ProductEntities>,[object Object],{,[object Object],public static void InitializeService(DataServiceConfigurationconfig),[object Object],{,[object Object],// Give readonly access to all of the entities,[object Object],config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);,[object Object],// Pagesize will change the max number of rows returned,[object Object],config.SetEntitySetPageSize("*", 25);,[object Object],config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;,[object Object],},[object Object],},[object Object]
Готовим ODataReflection Provider,[object Object],public class MyDataSource,[object Object],{ ,[object Object],    public IQueryable<Product> Products { get {…} } ,[object Object],    public IQueryable<Categories> Categories { get {…} } ,[object Object],},[object Object],public class MyDataSourceService: DataService<MyDataSource>,[object Object],{,[object Object],…,[object Object],},[object Object]
Готовим OData,[object Object],Демо,[object Object]
OData в SharePoint,[object Object]
SharePoint OData,[object Object],Content database,[object Object],SharePoint Data,[object Object],SharePoint,[object Object],LINQ to SharePoint,[object Object],ListData.svc,[object Object],Atom,[object Object],JSON,[object Object],Post, Put, Get,[object Object],Client Application,[object Object],Любая платформа,[object Object], .NET, Java,,[object Object],Flash, Silverlight,[object Object]
SharePoint OData,[object Object],Операции и HTTP действия,[object Object],Получение данных GET,[object Object],Создание записи POST,[object Object],Изменение записи PUT илиMERGE,[object Object],Удаление записи DELETE,[object Object],И всё это действует на ссылки,[object Object],Все политики SharePoint работают,[object Object],Валидация, Контроль доступа и т.д.,[object Object]
OData в SharePoint,[object Object],Демо,[object Object]
Vitaly Baum,[object Object],http://butaji.ru,[object Object],vbaum@live.com,[object Object]
Ресурсы,[object Object],http://sharepoint.microsoft.com/,[object Object],http://odata.org,[object Object],http://msdn.microsoft.com/en-us/library/ff478141.aspx,[object Object],http://blogs.msdn.com/b/alexj/archive/2010/01/07/data-service-providers-getting-started.aspx,[object Object]

Más contenido relacionado

SharePoint, LINQ, OData

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.