我正在嘗試使用LINQ和Entity Framework復制下面的SQL,但我無法弄清楚應該如何撰寫。
我的簡單的LINQ版本為每個表做了一個查詢public IActionResult Index() { dynamic view = new ExpandoObject(); view.AppUsers = Context.AppUsers.Count(); view.CustomerShops = Context.CustomerShops.Count(); view.FavouriteOrders = Context.FavouriteOrders.Count(); view.Items = Context.Items.Count(); view.ItemVariations = Context.ItemVariations.Count(); view.MenuCategories = Context.MenuCategories.Count(); view.MenuCategoryProducts = Context.MenuCategoryProducts.Count(); view.Orders = Context.Orders.Count(); view.Products = Context.Products.Count(); view.ProductVariations = Context.ProductVariations.Count(); view.Shops = Context.Shops.Count(); view.Staffs = Context.Staffs.Count(); return View(view);我時常使用這種模式來報告我的列計數,并認為這應該很容易在LINQ中實作,但到目前為止還沒有運氣。
這個純 SQL 的 UNION 將只產生 1 個 SQL 請求,而不是每個表的請求。
select * from ( select 'asp_net_roles' as type, count(*) from asp_net_roles union select 'asp_net_user_roles' as type, count(*) from asp_net_user_roles union select 'asp_net_users' as type, count(*) from asp_net_users union select 'app_users' as type, count(*) from app_users union 選擇 ' shops' 作為型別。count(*) from shops 聯盟 選擇 'staffs' 作為型別。count(*) from shops 聯盟 select 'items' as type, count(*) from items union select 'item_variations' as type, count(*) from item_variations union union select 'products' as type。count(*) from products union select 'product_variations' as type, count(*) from product_variations union union select 'menu_categories' as type, count(*) from menu_categories ) as counters order by 1。我看到一個部分實作[linq-group-by-multiple-tables](
uj5u.com熱心網友回復:
你的LINQ查詢沒有任何問題。它是非常可接受的方法。但是它并不是最有效的。
沒有必要從各個表中逐一獲取計數。你可以使用系統表
Sys.Objects和Sys.Partitions一次性獲得所有表的計數。試著在你的資料庫中運行這個查詢就可以了。
SELECT A.Name AS TableName, SUM(B.rows) AS RecordCount FROM sys.objects A INNER JOIN sys.partitions B ON A.object_id = B.object_id WHERE A.type = 'U' AND B.index_id IN (0, 1) GROUP BY A.Name為了快速回應和清潔代碼,你可以把這個SQL查詢存盤在一個字串變數中,然后運行LINQ
var result = dataContext.ExecuteQuery< YOUR_MODEL_CLASS> (your_string_query)。uj5u.com熱心網友回復:
我將會這樣寫:
Dictionary<string, int> view =new() { new() {'asp_net_roles', Context.AppUsers.Count() }, ... } return View(view);也許不是最純粹的方法,但可以完成作業(除非我誤解了你要完成的任務)
uj5u.com熱心網友回復:
使用我答案中的這個代碼
。并且用結果填充
ExpandoObject:var tablesinfo = Context.GetTablesInfo() 。 var expando = new ExpandoObject(); if (tablesinfo != null) { var dic = (IDictionary<string, object>)explaino; foreach(var info in tablesinfo) { dic.Add(info.TableName, info.RecordCount)。 } }想法是,如果你通過常數對物體進行分組,你可以UNION計數。 計劃中的函式建立了以下的IQueryable運算式:
var tablesinfo = Context.AppUsers.GroupBy(x => 1).Select(g => new TableInfo{ TableName = "asp_net_roles" , RecordCount = g.Count() }) .Context.MenuCategories.GroupBy(x => 1).Select(g => new TableInfo{ TableName = "menu_categories", RecordCount = g.Count() }) .Context.Items.GroupBy(x => 1).Select(g => new TableInfo{ TableName = " items", RecordCount = g.Count() }) ....轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310083.html
標籤:
上一篇:如何避免"System.InvalidOperationException:客戶端投影包含對一個常量運算式的參考"的錯誤?

