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
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; }
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
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.
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. –
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. –
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 –