मैं कैसे करने के लिए निर्धारित करने के लिए कोशिश कर रहा हूँ गिनती EntityFramework का उपयोग कर एक मेज पर मिलान पंक्तियाँ।
समस्या यह है कि प्रत्येक पंक्ति में कई मेगाबाइट डेटा (बाइनरी फ़ील्ड में) हो सकता है। बेशक SQL कुछ इस तरह होगा:
SELECT COUNT(*) FROM [MyTable] WHERE [fkID] = '1';
मैं सभी पंक्तियों को लोड कर सकता हूं और फिर गणना को निम्न के साथ ढूंढ सकता हूं :
var owner = context.MyContainer.Where(t => t.ID == '1');
owner.MyTable.Load();
var count = owner.MyTable.Count();
लेकिन वह स्थूल रूप से अक्षम है। क्या कोई सरल तरीका है?
संपादित करें: धन्यवाद, सभी। मैंने डीबी को एक निजी संलग्न से स्थानांतरित किया है ताकि मैं प्रोफाइलिंग चला सकूं; यह मदद करता है लेकिन भ्रम की स्थिति पैदा करता है जिसकी मुझे उम्मीद नहीं थी।
और मेरी वास्तविक डेटा थोड़ा गहरा है, मैं इस्तेमाल करेंगे ट्रक ले जाने Pallets के मामले की आइटम - और मैं नहीं करना चाहते ट्रक जब तक कि वहाँ है कम से कम एक छोड़ने के लिए आइटम उस में।
मेरे प्रयासों को नीचे दिखाया गया है। मुझे जो हिस्सा नहीं मिलता है वह यह है कि 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
[ मेरे पास वास्तव में ट्रक, ड्राइवर, पैलेट, मामले या आइटम नहीं हैं; जैसा कि आप एसक्यूएल से देख सकते हैं ट्रक-पैलेट और पैलेट-केस रिश्ते कई-से-कई हैं - हालांकि मुझे नहीं लगता कि यह मायने रखता है। मेरी वास्तविक वस्तुएं इंटिजीबल्स हैं और वर्णन करने में कठिन हैं, इसलिए मैंने नाम बदल दिए। ]