16

Azure Mobil Hizmetler Masa Kontrolörleri için aşağıdaki iç içe SQL üreten Varlık Framework.Neden ben şu kurulum oluşturduk bir <code>TableController</code></p> <p>ile kullanırken bir varlık Çerçeve konunun altına almaya çalışıyorum

  1. EntityFramework, TableController & varsayılan EntityDomainManager

    public class TodoItemController : TableController<TodoItem> 
    { 
        protected override void Initialize(HttpControllerContext controllerContext) 
        { 
         base.Initialize(controllerContext); 
         context = new MobileServiceContext(); 
         context.Database.Log += LogToDebug; 
         DomainManager = new EntityDomainManager<TodoItem>(context, Request); 
        } 
    
        public IQueryable<TodoItem> GetAllTodoItems() 
        { 
         var q = Query(); 
         return q; 
        } 
    
  2. Bir vanilya Web API 2 kontrolör güçlendirir yeni Mobil Web API ile sağlanan temel TodoItem örneği.

    public class TodoItemsWebController : ApiController 
    { 
    
        private MobileServiceContext db = new MobileServiceContext(); 
        public TodoItemsWebController() 
        { 
         db.Database.Log += LogToDebug; 
        } 
    
        public IQueryable<TodoItem> GetTodoItems() 
        { 
         return db.TodoItems; 
        } 
    

Sadece IQueryable

için Where(_ => !_.IsDeleted) modifikasyon eklemek DomainManager aracılığıyla çağrı proxy olarak Query yöntemle, içine kazma, bir ince dişli tarak ile tablecontroller kod geçtiniz

Yine de iki sorgular çOK farklı SQL üretirler. Düzenli Web API Controller için

, aşağıdaki SQL olsun.
SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Version] AS [Version], 
    [Extent1].[CreatedAt] AS [CreatedAt], 
    [Extent1].[UpdatedAt] AS [UpdatedAt], 
    [Extent1].[Deleted] AS [Deleted], 
    [Extent1].[Text] AS [Text], 
    [Extent1].[Complete] AS [Complete] 
    FROM [dbo].[TodoItems] AS [Extent1] 

Ama TableController için

, bir iç içe SQL deyiminde aşağıdaki bunun ortasında bir * Sihirli * Guid sahiptir SQL yığın ve sonuç almak. Bunun performansı, $ top, $ skip, $ filter ve $ expand gibi ODATAv3 sorgularından herhangi biriyle uğraşmaya başladığınızda tümüyle çöpe gider.

SELECT TOP (51) 
    [Project1].[C1] AS [C1], 
    [Project1].[C2] AS [C2], 
    [Project1].[C3] AS [C3], 
    [Project1].[Complete] AS [Complete], 
    [Project1].[C4] AS [C4], 
    [Project1].[Text] AS [Text], 
    [Project1].[C5] AS [C5], 
    [Project1].[Deleted] AS [Deleted], 
    [Project1].[C6] AS [C6], 
    [Project1].[UpdatedAt] AS [UpdatedAt], 
    [Project1].[C7] AS [C7], 
    [Project1].[CreatedAt] AS [CreatedAt], 
    [Project1].[C8] AS [C8], 
    [Project1].[Version] AS [Version], 
    [Project1].[C9] AS [C9], 
    [Project1].[Id] AS [Id] 
    FROM (SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Version] AS [Version], 
     [Extent1].[CreatedAt] AS [CreatedAt], 
     [Extent1].[UpdatedAt] AS [UpdatedAt], 
     [Extent1].[Deleted] AS [Deleted], 
     [Extent1].[Text] AS [Text], 
     [Extent1].[Complete] AS [Complete], 
     1 AS [C1], 
     N'804f84c6-7576-488a-af10-d7a6402da3bb' AS [C2], 
     N'Complete' AS [C3], 
     N'Text' AS [C4], 
     N'Deleted' AS [C5], 
     N'UpdatedAt' AS [C6], 
     N'CreatedAt' AS [C7], 
     N'Version' AS [C8], 
     N'Id' AS [C9] 
     FROM [dbo].[TodoItems] AS [Extent1] 
    ) AS [Project1] 
    ORDER BY [Project1].[Id] ASC 

Her iki sorgunun sonuçlarını burada görebilirsiniz.

https://pastebin.com/tSACq6eg Yani benim sorular şunlardır:

  • Neden bu şekilde SQL üreten TableController mı?

  • Sorgunun ortasında * magic * kılavuz nedir?

  • tam boru hattı IQueryable bu modifikasyonlar yaparak TableController (Ben durdurmak ve oturum, müşteri ya da belirli DB bağlam ise bilmiyorum bu yüzden uygulamayı yeniden başlatana kadar aynı kalacak)? Bunun bazı katman adımından bitti ya da geç Query() yöntemde sonra istekte yürütülen özelliğin üzerinde denir varsayalım, ama benim yaşam için bulamıyorum.

+0

Bu, Odata sorgularını uygulamak için mobil sunucu SDK'sı ile ilişkili olduğunu tahmin ediyorum. Var items = Query(). ToList() kullandığımızda, sql sorgusunun web api olarak doğru olduğunu buldum. Ama Odata sorgularını kullanamadık. –

+0

bu gerçekten bir seçenek değil, çünkü müşteri tüketicisi Odata $ vars kullanmaya dayanıyor. Örneğin. İlk yükte, başlangıç ​​DB Senkronizasyonunu gerçekleştirmek için API'ların çağrıları boyunca dolaşmak için '$ top' &' $ skip' kullanacaktır. –

+0

Bunun nedeni, EntityDomainManager'ın, eşzamanlılık denetimleri için her satırla birlikte alanların değerlerini indirip saklamasından kaynaklanır. Ve Guid kaynağından ETAG bir tür https://github.com/Azure/azure-mobile-apps-net-server/blob/master/src/Microsoft.Azure.Mobile.Server.Entity/EntityDomainManager.cs –

cevap

1

Arka plan ve istemci arasında senkronize edilen tablolardan biri, çünkü 2. sql alırsanız.

Devamı burada: Açıklamanız göre, biraz araştırma yaptım ve QueryableAttribute ile aynı eylemler için ek sorgu ile ilgili filtreler eklemek için Azure Mobil Sunucusu SDK TableControllerConfigProvider.cs altında aşağıdaki kod satırını kullanır bulmuştur https://documentation.devexpress.com/wpf/17927/Common-Concepts/Scaffolding-Wizard/Tutorials/Building-Outlook-Inspired-and-Hybrid-UI-Applications/Lesson-3-Customize-Layout-of-the-Collection-Views

5

OData sorgu parametrelerini desteklemek için bir denetleyici eylemi etkinleştirmek için.

controllerSettings.Services.Add(typeof(IFilterProvider), new TableFilterProvider()); 

Not: ek filtreler eylem çalıştırıldıktan sonra infaz ve IQueryable dönmek olacaktır.

Sen EnableQueryAttribute.cs kontrol edip OnActionExecutedExecuteQuery yöntemini çağırın ve sonunda OData sorgu seçeneklerini uygulamak için ODataQueryOptions.ApplyTo gerekeceğini belirledi olabilir IQueryable verilen üzere ($, $ filtresi, $ OrderBy, $ üst atlamak ve inlinecount $, vs.) .

Anlayışım gereği, Nested SQL deyimi OData bileşeni tarafından oluşturulur. ODataQueryOptions.ApplyTo çağrıldıktan sonra, IQueryable'ınız değiştirildi ve ilgili sql ifadesi de değiştirildi. Ben aşağıdaki gibi başvurabilecekler benim normal Web API Kontrolörü bazı test yaptım:

İstek:

Get http://localhost:58971/api/todoitem?$top=2&$select=Text,Id,Version 

OData sorgu seçeneklerini uygulamadan önce:

enter image description here

OData sorgu seçenekleri uygulandıktan sonra:

enter image description here

İlgili konular