Public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, String includeProperties = "")
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace EE_Q29131131
{
class Program
{
static IEnumerable<Person> people = (from i in Enumerable.Range(0, 50)
let now = DateTime.Now
select new Person { ID = i, FirstName = $"FirstName{i}", LastName = $"LastName{i}", IsWorking = i % 2 == 0, Start = now.AddDays(-(i * 9)), Finish = now.AddDays(-(i * 9)).AddHours(8) });
static void Main(string[] args)
{
Console.WriteLine($"First: {people.First()}");
Console.WriteLine($"Last: {people.Last()}");
var filtered = new QueryableReadOnlyRepository<Person>(people.AsQueryable()).Get<Person>(p => (p.IsWorking && (p.ID > 35 && p.ID < 40)), p => p.OrderBy(x => x.Start));
Console.WriteLine($"First: {filtered.First()}");
Console.WriteLine($"Last: {filtered.Last()}");
Console.ReadLine();
}
}
class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsWorking { get; set; }
public DateTime Start { get; set; }
public DateTime Finish { get; set; }
public override string ToString()
{
return $"{{ {string.Join(", ", from property in GetType().GetProperties() select $"{property.Name}: {property.GetValueOrValues(this)}")} }}";
}
}
public interface IReadOnlyRepository
{
IEnumerable<T> Get<T>(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null) where T : class;
}
public class QueryableReadOnlyRepository<T> : IReadOnlyRepository
{
protected readonly IQueryable<T> source;
public QueryableReadOnlyRepository(IQueryable<T> source)
{
this.source = source;
}
protected virtual IQueryable<T> GetQueryable<T>(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null) where T : class
{
IQueryable<T> query = source as IQueryable<T>;
if (filter != null)
{
query = query.Where(filter);
}
if (orderBy != null)
{
query = orderBy(query);
}
return query;
}
public virtual IEnumerable<T> Get<T>(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null) where T : class
{
return GetQueryable<T>(filter, orderBy);
}
}
static class Extensions
{
public static string GetValueOrValues(this PropertyInfo property, object source)
{
var value = property.GetValue(source, null);
if (value is null)
{
return string.Empty;
}
else if (property.PropertyType.Equals(typeof(string)) && typeof(IEnumerable<>).IsAssignableFrom(property.PropertyType))
{
return $"{{ {string.Join(", ", from item in value as IEnumerable<object> select item)} }}";
}
else
{
return value.ToString();
}
}
}
}
Produces the same output as above.
Open in new window
Which produces the following output -