Saya mencoba untuk menentukan bagaimana menghitung baris yang cocok pada tabel menggunakan EntityFramework.
Masalahnya adalah setiap baris mungkin memiliki banyak megabyte data (dalam bidang Biner). Tentu saja SQL akan menjadi seperti ini:
SELECT COUNT(*) FROM [MyTable] WHERE [fkID] = '1';
Saya dapat memuat semua baris dan kemudian menemukan Count dengan:
var owner = context.MyContainer.Where(t => t.ID == '1');
owner.MyTable.Load();
var count = owner.MyTable.Count();
Tapi itu sangat tidak efisien. Apakah ada cara yang lebih sederhana?
EDIT: Terima kasih, semuanya. Saya telah memindahkan DB dari lampiran pribadi sehingga saya dapat menjalankan profil; ini membantu tetapi menyebabkan kebingungan yang tidak saya duga.
Dan data real saya sedikit lebih dalam, saya akan menggunakan Truk membawa Palet dari Kasus of Items - dan saya tidak ingin Truk meninggalkan kecuali ada setidaknya satu item di dalamnya.
Upaya saya ditunjukkan di bawah ini. Bagian yang saya tidak mengerti adalah bahwa CASE_2 tidak pernah mengakses server DB (MSSQL).
var truck = context.Truck.FirstOrDefault(t => (t.ID == truckID));
if (truck == null)
return "Invalid Truck ID: " + truckID;
var dlist = from t in ve.Truck
where t.ID == truckID
select t.Driver;
if (dlist.Count() == 0)
return "No Driver for this Truck";
var plist = from t in ve.Truck where t.ID == truckID
from r in t.Pallet select r;
if (plist.Count() == 0)
return "No Pallets are in this Truck";
#if CASE_1
/// This works fine (using 'plist'):
var list1 = from r in plist
from c in r.Case
from i in c.Item
select i;
if (list1.Count() == 0)
return "No Items are in the Truck";
#endif
#if CASE_2
/// This never executes any SQL on the server.
var list2 = from r in truck.Pallet
from c in r.Case
from i in c.Item
select i;
bool ok = (list.Count() > 0);
if (!ok)
return "No Items are in the Truck";
#endif
#if CASE_3
/// Forced loading also works, as stated in the OP...
bool ok = false;
foreach (var pallet in truck.Pallet) {
pallet.Case.Load();
foreach (var kase in pallet.Case) {
kase.Item.Load();
var item = kase.Item.FirstOrDefault();
if (item != null) {
ok = true;
break;
}
}
if (ok) break;
}
if (!ok)
return "No Items are in the Truck";
#endif
Dan SQL yang dihasilkan dari CASE_1 disalurkan melalui sp_executesql , tetapi:
SELECT [Project1].[C1] AS [C1]
FROM ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(cast(1 as bit)) AS [A1]
FROM [dbo].[PalletTruckMap] AS [Extent1]
INNER JOIN [dbo].[PalletCaseMap] AS [Extent2] ON [Extent1].[PalletID] = [Extent2].[PalletID]
INNER JOIN [dbo].[Item] AS [Extent3] ON [Extent2].[CaseID] = [Extent3].[CaseID]
WHERE [Extent1].[TruckID] = '....'
) AS [GroupBy1] ) AS [Project1] ON 1 = 1
[ Saya tidak benar-benar memiliki Truk, Driver, Palet, Casing, atau Item; seperti yang Anda lihat dari SQL, hubungan Truck-Pallet dan Pallet-Case adalah many-to-many - meskipun menurut saya itu tidak penting. Objek asli saya tidak berwujud dan lebih sulit untuk dijelaskan, jadi saya mengubah namanya. ]