Skip to content

Commit

Permalink
Add result without total count
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Geramb committed Jun 26, 2019
1 parent 801f871 commit 549e6c9
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 86 deletions.
31 changes: 31 additions & 0 deletions DCCS.Data.Source.Tests/ResultQueryableExtensionsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,36 @@ public void Should_create_Result()

Assert.AreEqual(total, sut.Total);
}

[Test]
public void Should_create_Result_without_Total()
{
var total = 100;
var data = new Faker<Dummy>().Generate(total);
var sut = data.AsQueryable().ToResultWithoutTotal(new Params());
Assert.IsNotNull(sut);
}


[Test]
public void Should_create_ResultWithoutTotal_to_less_results()
{
var total = 100;
var data = new Faker<Dummy>().Generate(total);
var sut = data.AsQueryable().ToResultWithoutTotal(new Params { Page = 1, Count = 10000 });
Assert.AreEqual(100, sut.Data.Count());
}

[Test]
public void Should_create_ResultWithoutTotal_with_first_page()
{
var total = 100;
var data = new Faker<Dummy>().Generate(total);
// We request a none existing page, this should fallback in returning the first page
var sut = data.AsQueryable().ToResultWithoutTotal(new Params { Page = 1000, Count = 10 });
Assert.AreEqual(1, sut.Page);
Assert.AreEqual(10, sut.Data.Count());
}

}
}
2 changes: 0 additions & 2 deletions DCCS.Data.Source/Params.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,5 @@ public Params(Params ps)
public int? Count { get; set; }
public string OrderBy { get; set; }
public bool Desc { get; set; }


}
}
92 changes: 8 additions & 84 deletions DCCS.Data.Source/Result.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,100 +6,24 @@

namespace DCCS.Data.Source
{
public class Result<T> : Params
public class Result<T> : ResultWithoutTotal<T>
{
public IEnumerable<T> Data { get; protected set; }
public int Total { get; set; }

public Result(Params ps) : base(ps)
{ }

public Result(Params ps, IQueryable<T> data) : base(ps)
public Result(Params ps, IQueryable<T> data = null) : base(ps, data)
{
SetData(data);
}

public void SetData(IQueryable<T> data)
public override void SetData(IQueryable<T> data)
{
var result = Sort(data);

Total = result.Count();
if (data == null)
throw new ArgumentNullException(nameof(data));
Total = data.Count();
if (Count.HasValue)
{
Count = Math.Min(Count.Value, Total);
}

result = Paging(result);

Data = result.ToArray();
base.SetData(data);
}

public Result<DTO> Select<DTO>(Expression<Func<T, DTO>> predicate)
{
return new Result<DTO>(new Params
{
Count = Count,
OrderBy = OrderBy,
Desc = Desc,
Page = Page
})
{
Data = Data.AsQueryable().Select(predicate)
};
}

protected IQueryable<T> Sort(IQueryable<T> data)
{
// Sortieren...
if (!string.IsNullOrWhiteSpace(OrderBy))
{
return data.OrderBy($"{OrderBy} {(Desc ? "desc" : "")}");
}
else if (data.Expression.Type != typeof(IOrderedQueryable<T>))
{
// Vor einem Skip (siehe unten) muß ein OrderBy aufgerufen werden.
// Ist keine Sortierung angegeben, müssen wir dennoch sortieren und behalten
// dabei die Reihenfolge bei.
return data.OrderBy(x => true);
}

return data;
}

protected IQueryable<T> Paging(IQueryable<T> data)
{
// Pagen...
IQueryable<T> tempresult = null; // Wird für "Kann diese Seite überhaupt angezeigt werden" benötigt
if (Page.HasValue)
{
if (!Count.HasValue) throw new ArgumentNullException("Bei angegebener Seite (page) muss auch die Anzahl der Einträge (count) angegeben werden!");

//Manuel 24.10.2016
//INFO: es wurde falsche ergebnisse geliefert weil "OrderBy>true" gefehlt hat. -> das sollte sich stephan nochmal anschauen
//Folgende anpassungen sind als Quickfix anzusehen und sollten noch optimiert werden

var skip = (Page.Value - 1) * Count.Value;
var take = Count.Value;

//Ohne OrderBy, da es eine Sortierung gibt
if (!string.IsNullOrWhiteSpace(OrderBy))
{
tempresult = data.Skip(skip).Take(take);
}
//Mit OrderBy, da es keine Sortierung gibt
else
{
tempresult = data.Skip(skip).OrderBy(x => true).Take(take).OrderBy(x => true);
}
if (!tempresult.Any())
{
Page = 1;
tempresult = data.Take(Count.Value);
}
}

return (tempresult ?? new List<T>().AsQueryable());

}
public int Total { get; set; }
}
}
9 changes: 9 additions & 0 deletions DCCS.Data.Source/ResultQueryableExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,14 @@ public static Result<T> ToResult<T>(this IQueryable<T> source, Params ps)
}
return new Result<T>(ps, source);
}

public static ResultWithoutTotal<T> ToResultWithoutTotal<T>(this IQueryable<T> source, Params ps)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ResultWithoutTotal<T>(ps, source);
}
}
}
100 changes: 100 additions & 0 deletions DCCS.Data.Source/ResultWithoutTotal.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;

namespace DCCS.Data.Source
{
public class ResultWithoutTotal<T> : Params
{
public IEnumerable<T> Data { get; protected set; }

public ResultWithoutTotal(Params ps) : base(ps)
{ }

public ResultWithoutTotal(Params ps, IQueryable<T> data) : base(ps)
{
if (data != null)
SetData(data);
}

public virtual void SetData(IQueryable<T> data)
{
if (data == null)
throw new ArgumentNullException(nameof(data));
var result = Sort(data);

result = Paging(result);
Data = result.ToArray();
}

public Result<DTO> Select<DTO>(Expression<Func<T, DTO>> predicate)
{
return new Result<DTO>(new Params
{
Count = Count,
OrderBy = OrderBy,
Desc = Desc,
Page = Page
})
{
Data = Data.AsQueryable().Select(predicate)
};
}

protected IQueryable<T> Sort(IQueryable<T> data)
{
// Sortieren...
if (!string.IsNullOrWhiteSpace(OrderBy))
{
return data.OrderBy($"{OrderBy} {(Desc ? "desc" : "")}");
}
else if (data.Expression.Type != typeof(IOrderedQueryable<T>))
{
// Vor einem Skip (siehe unten) muß ein OrderBy aufgerufen werden.
// Ist keine Sortierung angegeben, müssen wir dennoch sortieren und behalten
// dabei die Reihenfolge bei.
return data.OrderBy(x => true);
}

return data;
}

protected IQueryable<T> Paging(IQueryable<T> data)
{
// Pagen...
IQueryable<T> tempresult = null; // Wird für "Kann diese Seite überhaupt angezeigt werden" benötigt
if (Page.HasValue)
{
if (!Count.HasValue) throw new ArgumentNullException("Bei angegebener Seite (page) muss auch die Anzahl der Einträge (count) angegeben werden!");

//Manuel 24.10.2016
//INFO: es wurde falsche ergebnisse geliefert weil "OrderBy>true" gefehlt hat. -> das sollte sich stephan nochmal anschauen
//Folgende anpassungen sind als Quickfix anzusehen und sollten noch optimiert werden

var skip = (Page.Value - 1) * Count.Value;
var take = Count.Value;

//Ohne OrderBy, da es eine Sortierung gibt
if (!string.IsNullOrWhiteSpace(OrderBy))
{
tempresult = data.Skip(skip).Take(take);
}
//Mit OrderBy, da es keine Sortierung gibt
else
{
tempresult = data.Skip(skip).OrderBy(x => true).Take(take).OrderBy(x => true);
}
if (!tempresult.Any())
{
Page = 1;
tempresult = data.Take(Count.Value);
}
}

return (tempresult ?? new List<T>().AsQueryable());

}
}
}

0 comments on commit 549e6c9

Please sign in to comment.