اگر جستجوی مدنظر چنین شکلی را داشته باشد:
مدلسازی نمونهی آن به صورت زیر است:
public class UIModel
{
public int PersianYear { set; get; }
public int[] SelectedPersianMonths { set; get; }
}
برای مثال اگر اطلاعات دریافتی از کاربر به صورت زیر باشد:
var model = new UIModel
{
PersianYear = 1391,
SelectedPersianMonths = new[] { 4, 5 }
};
کوئری گرفتن بر اساس ماههای انتخابی را (new DateTime را میتوانید با پارامتر PersianCalendar تعریف کنید و ... کار میکند) باید
بر اساس OR نوشت (حالت پیشفرض زنجیروار نوشتن Whereها And است):
var itemsQuery = context.Members.AsQueryable();
// Linq chaining where clauses as an `Or` instead of `And`
var predicate = PredicateBuilder.False<Member>();
foreach (var month in model.SelectedPersianMonths)
{
var start = new DateTime(model.PersianYear, month, 1, new PersianCalendar());
var end = new DateTime(model.PersianYear, month, month <= 6 ? 31 : 30, new PersianCalendar());
// We can chain `IQueryable`s.
// itemsQuery = itemsQuery.Where(x => x.JoinDate.Date >= start && x.JoinDate.Date <= end);
// But it will be translated as an `AND`, not `OR`
predicate = predicate.Or(x => x.JoinDate.Date >= start && x.JoinDate.Date <= end);
}
itemsQuery = itemsQuery.Where(predicate);
var items = itemsQuery.Select(x => new { x.FirstName, x.Surname }).ToList();
که یک چنین خروجی SQL ای را تولید میکند:
SELECT [m].[FirstName],
[m].[Surname]
FROM [Members] AS [m]
WHERE ((CONVERT (DATE, [m].[JoinDate]) >= '2012-06-21T00:00:00')
AND (CONVERT (DATE, [m].[JoinDate]) <= '2012-07-21T00:00:00'))
OR ((CONVERT (DATE, [m].[JoinDate]) >= '2012-07-22T00:00:00')
AND (CONVERT (DATE, [m].[JoinDate]) <= '2012-08-21T00:00:00'));
مثال کامل آن