مطالب
حذف جوین‌های اضافی به یک جدول در Entity framework
تذکر: این مطلب و نکته برای تا EF 6.1.3 تهیه شده‌است و ممکن است در نگارش‌های آتی آن وجود نداشته یا برطرف شده‌باشد.

کوئری ذیل را در نظر بگیرید:
var productsList1 = ctx.Products.Where(product => product.Id > 1)
    .Include(product => product.Category)
    .Include(product => product.User)
    .Where(
        product =>
            product.Category.Title.Contains("t") && product.Category.Id > 1 && product.Price > 100)
    .OrderBy(product => product.Price)
    .ToList();
به نظر شما این کوئری چند Join را ایجاد می‌کند؟
احتمالا شاید عنوان کنید که به ازای هر Include یک join خواهیم داشت. بنابراین دو جوین به جداول کاربران و گروه‌های محصول‌ها ایجاد می‌شود.

اما ... در واقعیت این کوئری را تولید می‌کند:
SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[Name] AS [Name],
    [Extent1].[Price] AS [Price],
    [Extent1].[CategoryId] AS [CategoryId],
    [Extent1].[UserId] AS [UserId],
    [Extent3].[Id] AS [Id1],
    [Extent3].[Name] AS [Name1],
    [Extent3].[Title] AS [Title],
    [Extent3].[UserId] AS [UserId1],
    [Extent4].[Id] AS [Id2],
    [Extent4].[Name] AS [Name2]
    FROM    [dbo].[Products] AS [Extent1]
    INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryId] = [Extent2].[Id]
    LEFT OUTER JOIN [dbo].[Categories] AS [Extent3] ON [Extent1].[CategoryId] = [Extent3].[Id]
    LEFT OUTER JOIN [dbo].[Users] AS [Extent4] ON [Extent1].[UserId] = [Extent4].[Id]
    WHERE ([Extent1].[Id] > 1) AND ([Extent2].[Title] LIKE N'%t%') AND ([Extent1].[CategoryId] > 1) AND ([Extent1].[Price] > 100)
    ORDER BY [Extent1].[Price] ASC
اگر به قسمت جوین‌های آن دقت کنید دوبار جوین به جدول Categories را می‌توانید مشاهده کنید.
این دو جوین حاصل یکبار Include جدول Categories و یکبار استفاده از navigation property آن در قسمت where است.

این باگ در اینجا گزارش شده، ولی به نظر هنوز برطرف نشده‌است یا مجددا ظاهر شده‌است.

برای رفع آن در حال حاضر بهترین راه حل استفاده از روش ذیل است:
var query2 = from product in ctx.Products
             let category = product.Category
             where product.Id > 1
             where category.Title.Contains("t") && category.Id > 1 && product.Price > 100
             select new { product, category }; 
var productsList2 = query2.ToList();
در اینجا قسمت Include کلا حذف شده و همچنین گروه‌ها توسط یک متغیر موقتی که با let ایجاد شده‌است، استفاده می‌شود. خروجی آن کوئری ذیل است:
SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[Name] AS [Name],
    [Extent1].[Price] AS [Price],
    [Extent1].[CategoryId] AS [CategoryId],
    [Extent1].[UserId] AS [UserId],
    [Extent2].[Id] AS [Id1],
    [Extent2].[Name] AS [Name1],
    [Extent2].[Title] AS [Title],
    [Extent2].[UserId] AS [UserId1]
    FROM  [dbo].[Products] AS [Extent1]
    INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryId] = [Extent2].[Id]
    WHERE ([Extent1].[Id] > 1) AND ([Extent2].[Title] LIKE N'%t%') AND ([Extent2].[Id] > 1) AND ([Extent1].[Price] > 100)
همانطور که مشاهده می‌کنید، اینبار فقط یکبار جوین به جدول گروه‌ها تشکیل شده‌است.

چند نکته:
-در کوئری let دار، اگر در قسمت select نهایی فقط product ذکر شود، هرچند جوین به جدول گروه‌ها تشکیل می‌شود اما فیلدهای این جدول انتخاب نخواهند شد.
-معادل کوئری LINQ نوشته شده را اگر بخواهیم توسط متدهای الحاقی بازنویسی کنیم، به کوئری ذیل خواهیم رسید:
var query2ChainedVersion = ctx.Products
     .Select(product => new { product, category = product.Category })
     .Where(@t => @t.product.Id > 1)
     .Where(@t => @t.category.Title.Contains("t") && @t.category.Id > 1 && @t.product.Price > 100)
     .Select(@t => new { @t.product , @t.category });

اگر علاقمند به آزمایش این باگ هستید، کدهای کامل آن‌را از اینجا می‌توانید دریافت کنید:
  Sample38.zip
نظرات مطالب
مقایسه امنیت Oracle11g و SQL server 2008 از دید آمار در سال 2009
یه موضوعی که تو این آمار بهش اشاره نشده تعداد و میزان حرفه ای بودن پروژه هایی هست که دارن از این دیتابیس ها استفاده میکنن. ممکنه این آمار اینجوری بدست اومده باشه که مثلا 10 تا سرور اوراکل تپل رو اومده مقایسه کرده باشه با 2تا سرور اس کیو ال معمولی و در این حالت باگ ها رو شمرده باشه. طبیعتا باگ های امنیتی اونی که در پروژه های بیشتری استفاده شده و سطح پروژه هم اینترپرایزتر هست ملموس تر هست. مثله قضیه ویندوز و لینوکس منظورم هست که اگه فراگیری ویندوز رو لینوکس هم داشت مطمئنا مورد حمله های بیشتری به نسبت ویندوز قرار می گرفت.
نظرات مطالب
راه اندازی StimulSoft Report در ASP.NET MVC
سلام
محیط گزارش شما فارسیه و توی کدهاتون هم یه فایل fa.xml دارید. این فایل و نحوه فارسی کردن محیط گزارش (نه محیط دیزاین) به چه صورته؟
نظرات مطالب
طراحی گزارش در Stimulsoft Reports.Net – بخش 2
با سلام.
در قسمت پشتیبانی سایت Stimulsoft نوشته شده که این گزارش ساز فقط از قلمهای نصب شده بر روی سیستمی که بر روی آن گزارش تولید میشود پشتیبانی میکند.
نظرات مطالب
چند ستونه کردن در iTextSharp
با سلام ...
به نظر شما بهتر نیست برای کارهامون از ابزارهای گزارش ساز استفاده کنیم؟
 به نظر جای خالی مطلبی درباره ابزارهای گزارش ساز و مقایسه اونها در سایتتون احساس میشه.

ممنون از سایت خوبتون...
پاسخ به بازخورد‌های پروژه‌ها
درخواست همزمان گزارش
سلام
در  FlushInBrowser ، نام فارسی  دارای فاصله  را صحیح اعمال نمی‌کند.
مثال:
"گزارش عملکرد کارکنان" می‌شود " گزارش "

بازخوردهای پروژه‌ها
گزارش گیری از رکوردی با حداقل 30 فیلد
سلام ... 
من یه پروژه دارم که از رکوردی که در حدود 30 تا 40 تا فیلد داره باید گزارش بگیرم ... حالا نمیدونم چیجوری با این کتابخونه بشه یه گزارش منطقی درست کرد؟! 
بازخوردهای پروژه‌ها
ارتباطات بین جداول
با سلام و تشکر از پروژه‌ی خوبتان که تو یاد گیری MVC خیلی کمکم میکنه
جدول UserMetaDatas چرا با جدول Users رابطه‌ی یک به چند (  one to many ) داره؟ مگه جدول UserMetaDatas  برای نگه داری مشخصات کاربر نیست؟ و هر کاربر نیز مشخصات واحدی داره مثل تاریخ تولد! به نظر باید رابطه یک به یک باشه یا مساله ای هست و من متوجه نشدم؟ بازم تشکر از شما

نظرات اشتراک‌ها
دوراهی انتخاب NHibernate و Entityframework
اتفاقا یکی از دوستان که پروژه ای با این مشخصات رو داره نگهداری میکنه در مورد استفاده از اوراکل با استفاده از EF تستهایی رو انجام داده و برای مهاجرت از یه لایه پر از دردسر و خطا آماده شده ولی حجم پروژه اجازه سریع این حرکت رو از ایشون گرفته.
اشتراک‌ها
نوشتن برنامه جهت پایش سخت افزار سیستم

با استفاده از این کتابخانه به راحتی می‌توان اطلاعات سخت افزاری زیر را به دست آورد

جزئیات بایوس 

به دست آوردن مدل و مشخصات cpu  و RAM

درجه حرارت cpu

وضعیت فن ها

مدل کارت گرافیک

.

.

.

نوشتن برنامه جهت پایش سخت افزار سیستم