using System.Collections;
using System.Collections.Generic;
using System.Linq.Dynamic.Core.Exceptions;
using System.Linq.Dynamic.Core.Tests.Helpers.Models;
using Linq.PropertyTranslator.Core;
using QueryInterceptor.Core;
using Xunit;
using NFluent;
#if EFCORE
using Microsoft.AspNetCore.Identity;
#else
using Microsoft.AspNet.Identity.EntityFramework;
#endif
namespace System.Linq.Dynamic.Core.Tests
{
public partial class QueryableTests
{
public class Example
{
public int Field;
public DateTime Time { get; set; }
public DateTime? TimeNull { get; set; }
public DayOfWeek? DOWNull { get; set; }
public DayOfWeek DOW { get; set; }
public int Sec { get; set; }
public int? SecNull { get; set; }
public class NestedDto
{
public string Name { get; set; }
public class NestedDto2
{
public string Name2 { get; set; }
}
}
}
public class ExampleWithConstructor
{
public DateTime Time { get; set; }
public DayOfWeek? DOWNull { get; set; }
public DayOfWeek DOW { get; set; }
public int Sec { get; set; }
public int? SecNull { get; set; }
public ExampleWithConstructor(DateTime t, DayOfWeek? dn, DayOfWeek d, int s, int? sn)
{
Time = t;
DOWNull = dn;
DOW = d;
Sec = s;
SecNull = sn;
}
}
///
/// Cannot work with property which in base class. https://github.com/StefH/System.Linq.Dynamic.Core/issues/23
///
[Fact]
public void Select_Dynamic_PropertyInBaseClass()
{
var queryable = new[] { new IdentityUser("a"), new IdentityUser("b") }.AsQueryable();
var expected = queryable.Select(i => i.Id);
var dynamic = queryable.Select("Id");
Assert.Equal(expected.ToArray(), dynamic.ToArray());
}
[Fact]
public void Select_Dynamic1()
{
// Assign
var qry = User.GenerateSampleModels(1).AsQueryable();
// Act
var userRoles1 = qry.Select("new (Roles.Select(Id) as RoleIds)");
var userRoles2 = qry.Select("new (Roles.Select(it.Id) as RoleIds)");
// Assert
Check.That(userRoles1.Count()).IsEqualTo(1);
Check.That(userRoles2.Count()).IsEqualTo(1);
}
[Fact]
public void Select_Dynamic2()
{
// Assign
var qry = User.GenerateSampleModels(1).AsQueryable();
// Act
var userRoles = qry.Select("new (Roles.Select(it).ToArray() as Rolez)");
// Assert
Check.That(userRoles.Count()).IsEqualTo(1);
}
[Fact]
public void Select_Dynamic3()
{
//Arrange
List range = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var testList = User.GenerateSampleModels(100);
var qry = testList.AsQueryable();
//Act
IEnumerable rangeResult = range.AsQueryable().Select("it * it");
var userNames = qry.Select("UserName");
var userFirstName = qry.Select("new (UserName, Profile.FirstName as MyFirstName)");
var userRoles = qry.Select("new (UserName, Roles.Select(Id) AS RoleIds)");
//Assert
Assert.Equal(range.Select(x => x * x).ToArray(), rangeResult.Cast().ToArray());
#if NET35
Assert.Equal(testList.Select(x => x.UserName).ToArray(), userNames.AsEnumerable().Cast().ToArray());
Assert.Equal(
testList.Select(x => "{ UserName = " + x.UserName + ", MyFirstName = " + x.Profile.FirstName + " }").ToArray(),
userFirstName.Cast