var testQuery = _repository.GetAll()
.WhereIf(input.SortDateStart != null && input.SortDateEnd != null,
faqs => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd)
.WhereIf(input.SortDateStart != null && input.SortDateEnd is null,
faqs => faqs.CreationTime >= input.SortDateStart).Count();
input.SortDateStart != null && input.SortDateEnd != null
((input.SortDateStart != null) && (input.SortDateEnd != null))
.WhereIf
это выборка/запрос (как удобнее)... так вот вторая идет из первой. и по моему в первой вы уже отсекаете незавершенные. WhereIf
не совсем типичный метод. тут поддержу коллег.. опять же, может во Where
получатся более прозрачные условия )))faqs => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd
использование faqs
в его определении.. сам бы ни когда не стал так делать...faqs //аргумент лямбды
=> // разделитель аргумента и тела
// скобок нет - значит, дальше идёт вычисляемое лямбдой выражение
faqs.CreationTime >= input.SortDateStart //первый операнд
&& //оператор логического И
faqs.CreationTime <= input.SortDateEnd //второй операнд
bool lambda_func(SomeStructure faqs)
{ //input в лямбде доступен через замыкание
return (faqs.CreationTime >= input.SortDateStart) && (faqs.CreationTime <= input.SortDateEnd);
}
Lambda expressions
In the previous example, notice that the conditional expression (num % 2 == 0) is passed as an in-line argument to the Enumerable.Where method: Where(num => num % 2 == 0). This inline expression is a lambda expression.
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Drawing;
static class Program
{
private static void Main(string[] args)
{
var input = gen();
input.print();
faqs().print();
}
static void print(this string s) => Console.WriteLine(s);
static void print(this IEnumerable<Event> en) { foreach (var e in en) $"{e.SortDateStart} {e.SortDateEnd}".print(); }
static IEnumerable<Event> gen()
{
var rnd = new Random();
var dts = DateTime.Today;
for (var i = 0; i < 6; i++)
{
var r = rnd.Next();
var t = new TimeSpan(r);
yield return new Event { SortDateStart = dts.Add(t), SortDateEnd = dts.Subtract(t) };
}
}
static IEnumerable<Event> faqs()
{
return IEnumerable < Event > gen() => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd;
}
}
public class Event
{
public DateTime SortDateStart { get; set; }
public DateTime SortDateEnd { get; set; }
}
попробуй скомпилировать... и повторюсь - если научишь новому? буду благодарен using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Drawing;
static class Program
{
private static void Main(string[] args)
{
var input = gen();
input.print();
faqs().print();
}
static void print(this string s) => Console.WriteLine(s);
static void print(this IEnumerable<Event> en) { foreach (var e in en) $"{e.SortDateStart} {e.SortDateEnd}".print(); }
static IEnumerable<Event> gen()
{
var rnd = new Random();
var dts = DateTime.Today;
for (var i = 0; i < 6; i++)
{
var r = rnd.Next();
var t = new TimeSpan(r);
yield return new Event { SortDateStart = dts.Add(t), SortDateEnd = dts.Subtract(t) };
}
}
static IEnumerable<Event> faqs()
{
return faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd;
}
}
public class Event
{
public DateTime SortDateStart { get; set; }
public DateTime SortDateEnd { get; set; }
}
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Drawing;
static class Program
{
private static void Main(string[] args)
{
var input = gen();
input.print();
faqs().print();
}
static void print(this string s) => Console.WriteLine(s);
static void print(this IEnumerable<Event> en) { foreach (var e in en) $"{e.SortDateStart} {e.SortDateEnd}".print(); }
static IEnumerable<Event> gen()
{
var rnd = new Random();
var dts = DateTime.Today;
for (var i = 0; i < 6; i++)
{
var r = rnd.Next();
var t = new TimeSpan(r);
yield return new Event { SortDateStart = dts.Add(t), SortDateEnd = dts.Subtract(t) };
}
}
static IEnumerable<Event> faqs() => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd;
}
public class Event
{
public DateTime SortDateStart { get; set; }
public DateTime SortDateEnd { get; set; }
}
faqs => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd
- скобок после faqs нет.static IEnumerable<Event> faqs() => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd;
- скобки есть. Конечно, смысл от этого поменяется! У ОПа faqs - имя параметра, у тебя - имя метода. Как бэ не одно и то же.namespace ConsoleApp1
{
public class InputClass //заглушка для типа данных, экземпляром которого является input
{
public DateTime SortDateStart;
public DateTime SortDateEnd;
public InputClass(DateTime start, DateTime end) { SortDateStart = start; SortDateEnd = end; }
}
public class FaqsClass //заглушка для типа данных, экземпляром которого является faqs
{
public DateTime CreationTime;
public FaqsClass(DateTime ctime) { CreationTime = ctime; }
}
internal class Program
{
static void Main(string[] args)
{
DateTime now = DateTime.Now;
var input = new InputClass(now, now + TimeSpan.FromSeconds(5));
// описываем лямбду-предикат
Func<FaqsClass, bool> my_lambda = faqs => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd;
var many_faqs_given = new FaqsClass[10];
for (int i = 0; i < many_faqs_given.Length; i++)
// только 6 значений (+0...+5) попадут в диапазон, описанный input
many_faqs_given[i] = new FaqsClass(now + TimeSpan.FromSeconds(i));
foreach (var f in many_faqs_given.Where(my_lambda))
Console.WriteLine("Match"); // выведет Match 6 раз
}
}
}
WhereIfэто не от мелких..
Func<FaqsClass, bool> my_lambda = faqs => faqs.CreationTime >= input.SortDateStart && faqs.CreationTime <= input.SortDateEnd;
но тут да, красавчик... но осталось малое.. узнать что в кишках https://github.com/aspnetboilerplate/aspnetboilerplate