‫فواید LINQ و LINQ-to-Objects

اگر عادت کنید به استفاده از LINQ بعداً می‌توانید از یکی از مزایای مفید آن استفاده کنید. مدتی پیش مجبور شدم یک سری بهینه‌سازی‌هایی روی دسترسی به دیتابیس انجام دهم. یکی از موارد رایجی که برای بهینه‌سازی پیدا کردم entityهایی بودند که با یک query لینک از دیتابیس فراخوانی می‌شدند. این entityها تعداد رکورد محدودی داشتند، معمولاً خیلی کم تغییر می‌کردند ولی استفاده کنندگان زیادی داشتند. مثلاً فرض کنید آیتم‌های یک منو که در تمام صفحات برنامه مورد نیاز هستند.

در مورد این entityها به ذهنم رسید که همه آنها در ابتدای کار برنامه به جای ثابتی در حافظه load کرده و سپس هر وقت که با آنها کار داشتم از آنجا استفاده کنم. خوشبختانه چون قبلاً از LINQ برای query زدن استفاده کرده بودم، روال query زدن از objectهای موجود در حافظه چندان سخت نبود. کافی بود در query دیتابیسی مقدار in را به جای خواندن از دیتابیس با آن Array یا Collection موجود در حافظه عوض کنم و بعضی ملاحظات LINQ-to-Objects را رعایت کنم. به این ترتیب هم روش query زدنم عوض نشد و هم مجبور نشدم برای استخراج اطلاعات از حافظه از روش‌های foreach و loop و… استفاده کنم.

‫SQL Recursive Queries به راحتي آب خوردن

مدت‌ها بود كه كار يكي از گزارشاتم لنگ يك كوئري ريكرسيو (اس كيو ال) بود و من از ترس پيچيدگي زيادش جرات نداشتم بهش نزديك بشم. ولي فشار مشتري منو مجبور كرد كه اين كار رو بكنم. موثق‌ترين منبع در اينترنت براي انجام اين كار مقاله‌اي در ام اس دي ان به نام Recursive Queries Using Common Table Expressions در اين آدرس. اين مقاله با كمك مفهوم common table expression سعي دارد يك كوئري ريكرسيو بنويسد. مقاله خيلي خوب است ولي نياز من خيلي ساده‌تر از اين بود. من فقط مي‌خواستم از يك جدول كه يك ساختار درختي را در خود نگه مي‌داشت و شامل يك كليد به خودش بود اطلاعات ساده‌اي مثل بالاترين parent را استخراج كنم. خوشبختانه يكي از همكاران بنده قبلا روي چنين موضوعي كار كرده و يك Stored Procedure براي اين كار نوشته بود. من هم با كمك اين sp يك User Defined Function نوشتم كه مشابه توابع ريكرسيو معمولي در كدهاي سي‌شارپ و غيره عمل مي‌كرد. در واقع اصل قضيه اين بود كه مقاله اشاره شده در بالا سعي مي‌كند در داخل خود كوئري منطق ريكرسيو بودن را بگنجاند و اگر از SQL User Defined Function‌ها استفاده شود راه حل فوق العاده ساده مي‌شود. در ادامه تابع
ريكرسيو ما را ببينيد:

CREATE FUNCTION [dbo].[GetParentID](@Id bigint)RETURNS bigintASBEGIN–تابعي براي پيدا کردن گروه مادر يک گروه دارايي–recursive query idea by Ghane–http://faraconesh.net:8080/browse/IRISL-386–usage: select id, dbo.GetParentID(id) as ‘GetParentID’,Parent_id_fk,* from Asset_AssetGroup
declare @parentId bigint Select @parentId = Parent_id_fk From Asset_AssetGroup Where ID = @Id
If (@parentId Is Null) RETURN @Id else RETURN dbo.GetParentID(@parentId)
–following RETURN never be ranRETURN -1END