Im zweiten Teil seiner OData Session zeigt Rainer Stropek, wie man eigene OData-Provider entwickelt. In einem durchgängigen Beispiel demonstriert er, wie man erst einen LINQ-Provider und darauf aufbauend einen OData-konformen REST Service erstellt und von verschiedenen Programmiersprachen und Tools darauf zugreift. In der Session werden Grundkenntnisse von OData und LINQ vorausgesetzt.
2. Introduction
• You all know what OData is?
– Short demo to introduce OData?
• You are all familiar with LINQ &
IQueryable?
– Short demo to introduce IQueryable?
3. What is the basic idea of OData and IQueryable regarding database
queries?
ARCHITECTURE
4. Architecture of C#, OData and IQueryable
Compiler
Generator
Grammar
rules
Tree
Source Lexer, Parser Generator Target
(Syntax Tree)
Interpreter
5. Architecture of C#, OData and IQueryable
C# Compiler BCL
C# IL
Expression
Tree
OData Query
(URI) SQL
OData Entity
runtime Framework
Interpret or
rewrite
7. Solution = Sharding
Clients Load
Balancer
DB Load
Web Farm Balancing Cluster
of Failover
Cloud Clusters
8. How can we build a custom IQueryable?
CUSTOM IQUERYABLE
9. Custom IQueryable
• Use IQToolkit if possible
• Derive your implementation from
QueryProvider
• Implement two virtual methods
– object Execute(Expression expression)
– string GetQueryText(Expression expression)
(Optional)
10. Using Custom IQueryable
• Expression tree is received by query
provider
• We have to rewrite and run it to all e.g.
sharding databases
11. Implement Queryable
• Use .NET‘s visitor pattern to examine and rewrite
expression tree
• AnalyzeQueryVisitor
– Verifies that query is ok (e.g. must contain top-clause,
etc.)
– Stores reference to e.g. Take and Skip clauses
12. How can we build a custom OData provider?
CUSTOM ODATA PROVIDER
13. Custom OData Building Blocks
• Derive from DataService<T>
– Main entry point for developing a WCF Data Service
• Implement IServiceProvider to provide...
– ...IDataServiceMetadataProvider
• Build custom metadata
• Build OData metadata with e.g. reflection
– ... IDataServiceQueryProvider
• Provide an underlying IQueryable for query execution
14. Workflow for OData Query
(simplified)
Get metdata
service
Get query
provider
Create data-
source
Set current
data source
Initialize
service Get IQueryable
used for getting Provide
Resolve resource data metdata
set
Get query
root (IQueryable)
16. IDataServiceMetadataProvider
public interface IDataServiceMetadataProvider
{
Service Ops not
string ContainerName { get; } covered here
string ContainerNamespace { get; }
IEnumerable<ResourceSet> ResourceSets { get; }
IEnumerable<ServiceOperation> ServiceOperations { get; }
IEnumerable<ResourceType> Types { get; }
IEnumerable<ResourceType> GetDerivedTypes(ResourceType resourceType);
ResourceAssociationSet GetResourceAssociationSet(
ResourceSet resourceSet, ResourceType resourceType,
ResourceProperty resourceProperty);
bool HasDerivedTypes(ResourceType resourceType);
bool TryResolveResourceSet(string name, out ResourceSet resourceSet);
bool TryResolveResourceType(string name, out ResourceType resourceType);
bool TryResolveServiceOperation(string name,
out ServiceOperation serviceOperation);
}
17. IDataServiceQueryProvider
• Provides root IQueryable for a given
resource set
• CustomDataServiceProvider is a simple
generic implementation of
IDataServiceQueryProvider