난 카운트 테이블을 일치하는 방법을 결정하려고 노력하고있어 EntityFramework를 사용하여 테이블에.내용을로드하지 않고 EntityFramework에서 행을 COUNT하는 방법은 무엇입니까?
문제는 각 행에 (2 진수 필드에서) 많은 메가 바이트의 데이터가있을 수 있다는 것입니다.
SELECT COUNT(*) FROM [MyTable] WHERE [fkID] = '1';
나는 다음과 백작을 찾아 모든 행과 을로드 할 수 : 물론 SQL은 다음과 같이 될 것이다
var owner = context.MyContainer.Where(t => t.ID == '1');
owner.MyTable.Load();
var count = owner.MyTable.Count();
을하지만 조잡한 비효율적이다. 더 간단한 방법이 있습니까?
편집 : 감사합니다. 프로파일 링을 실행할 수 있도록 DB를 전용 첨부 파일에서 옮겼습니다. 이것은 도움이되지만 내가 예상하지 못한 혼란을 야기합니다. 에서가 없다면 내가 떠나야하는 트럭 싶지 않아 -
그리고 내 실제 데이터가 조금 더 깊은, 내가 케이스의이 항목의트럭이 팔레트를 들고 사용합니다 최소 하나 항목입니다.
내 시도는 다음과 같습니다. 내가 얻지 못하는 부분은 CASE_2가 절대로 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
그리고 CASE_1으로 인한 SQL이 sp_executesql을을 통해 파이프 있지만 :
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
[정말 트럭, 드라이버, 팔레트, 케이스 또는 항목이없는; SQL에서 볼 수 있듯이 Truck-Pallet과 Pallet-Case 관계는 다 대다 (many-to-many) 관계입니다. 내 실제 대상은 무형이며 설명하기가 어렵 기 때문에 이름을 변경했습니다.]
어떻게 팔레트 적재 문제를 해결 했습니까? – Sherlock