Tôi đang cố gắng xác định cách đếm các hàng phù hợp trên bảng bằng EntityFramework.
Vấn đề là mỗi hàng có thể có nhiều megabyte dữ liệu (trong trường Nhị phân). Tất nhiên SQL sẽ giống như sau:
SELECT COUNT(*) FROM [MyTable] WHERE [fkID] = '1';
Tôi có thể tải tất cả các hàng và sau đó tìm Số đếm với:
var owner = context.MyContainer.Where(t => t.ID == '1');
owner.MyTable.Load();
var count = owner.MyTable.Count();
Nhưng điều đó hoàn toàn không hiệu quả. đó có phải là cách dễ hơn?
EDIT: Cảm ơn, tất cả. Tôi đã chuyển DB từ một tệp đính kèm riêng tư để tôi có thể chạy hồ sơ; điều này giúp ích nhưng gây ra sự nhầm lẫn mà tôi không mong đợi.
Và dữ liệu thật của tôi là một chút sâu hơn, tôi sẽ sử dụng xe tải chở pallet của trường hợp của Items - và tôi không muốn các xe tải rời khỏi trừ khi có ít nhất một mục trong đó.
Những nỗ lực của tôi được hiển thị bên dưới. Phần tôi không hiểu là CASE_2 không bao giờ truy cập vào máy chủ 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
Và SQL kết quả từ CASE_1 được chuyển qua sp_executesql , nhưng:
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
[ Tôi thực sự không có Xe tải, Lái xe, Pallet, Thùng hoặc Vật dụng; như bạn có thể thấy từ SQL mối quan hệ Xe tải-Pallet và Pallet-Case là nhiều-nhiều - mặc dù tôi không nghĩ điều đó quan trọng. Các đối tượng thực của tôi vô hình và khó mô tả hơn, vì vậy tôi đã đổi tên. ]