আমি সারণী ফ্রেমওয়ার্কটি ব্যবহার করে কোনও টেবিলে কীভাবে ম্যাচের সারিগুলি গণনা করব তা নির্ধারণ করার চেষ্টা করছি ।
সমস্যাটি হ'ল প্রতিটি সারিতে অনেক মেগাবাইট ডেটা থাকতে পারে (একটি বাইনারি ক্ষেত্রে)। অবশ্যই এসকিউএল এর কিছু হবে:
SELECT COUNT(*) FROM [MyTable] WHERE [fkID] = '1';
আমি সমস্ত সারি লোড করতে পারতাম এবং এর সাথে গণনাটি খুঁজে পেতে পারি:
var owner = context.MyContainer.Where(t => t.ID == '1');
owner.MyTable.Load();
var count = owner.MyTable.Count();
তবে তা চূড়ান্তভাবে অক্ষম। একটি সহজ উপায় আছে কি?
সম্পাদনা: ধন্যবাদ, সব। আমি একটি প্রাইভেট সংযুক্ত থেকে ডিবি স্থানান্তরিত করেছি যাতে আমি প্রোফাইল চালাতে পারি; এটি সাহায্য করে কিন্তু বিভ্রান্তির সৃষ্টি করে যা আমি প্রত্যাশা করি না।
এবং আমার আসল তথ্যটি আরও গভীরতর, আমি আইটেমস এর কেসস অফ প্যালেট বহনকারী ট্রাকগুলি ব্যবহার করব - এবং আমি কমপক্ষে একটি আইটেম না থাকলে ট্রাকটি ছেড়ে যেতে চাই না ।
আমার প্রচেষ্টা নীচে প্রদর্শিত হয়। আমি যে অংশটি পাই না তা হ'ল CASE_2 কখনই ডিবি সার্ভার (এমএসএসকিউএল) অ্যাক্সেস করে না।
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 ফলে মাধ্যমে পাইপ হয় 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
[ আমার কাছে আসলে ট্রাক, ড্রাইভার, প্যালেটস, কেস বা আইটেম নেই; এসকিউএল থেকে আপনি দেখতে পাচ্ছেন যে ট্রাক-প্যালেট এবং প্যালেট-কেস সম্পর্কগুলি অনেকগুলি-অনেকগুলি - যদিও আমি মনে করি না যে এটি গুরুত্বপূর্ণ। আমার আসল অবজেক্টগুলি অদৃশ্য এবং বর্ণনা করা আরও শক্ত, সুতরাং আমি নাম পরিবর্তন করেছি। ]