- 调整 ISelect linq to sql 和 queryable 实现依赖移至 FreeSql.Extensions.Linq;#260

This commit is contained in:
28810
2020-04-10 02:28:33 +08:00
parent 98fc8baade
commit 5f98749652
21 changed files with 987 additions and 435 deletions

View File

@ -563,8 +563,6 @@ WHERE ROWNUM < 11";
.UpdateColumns(x => new { x.Status, x.CategoryId, x.ArticleTitle })
.ToSql();
var sqldddklist = g.mysql.Select<NewsArticle>().Select(a => new NewsArticleDto { }).ToList();
var sql1111333 = g.mysql.Update<Model2>()
.SetSource(new Model2 { id = 1, Title = "xxx", Parent_id = 0 })
@ -608,15 +606,6 @@ WHERE ROWNUM < 11";
.ToList();
var ttt1 = g.mysql.Select<Model1>().Where(a => a.Childs.AsSelect().Any(b => b.Title == "111")).ToList();
var linqto1 =
from p in g.mysql.Select<Order>()
where p.Id >= 0
// && p.OrderDetails.AsSelect().Where(c => c.Id > 10).Any()
orderby p.Id descending
orderby p.CustomerName ascending
select new { Name = p.CustomerName, Length = p.Id };
var testpid1 = g.mysql.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
g.mysql.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();

View File

@ -30,6 +30,7 @@
<ItemGroup>
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" />
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.Linq\FreeSql.Extensions.Linq.csproj" />
<ProjectReference Include="..\..\FreeSql.DbContext\FreeSql.DbContext.csproj" />
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.MsAccess\FreeSql.Provider.MsAccess.csproj" />

View File

@ -0,0 +1,202 @@
using FreeSql.DataAnnotations;
using System;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Linq
{
class TestQueryableLinqToSql
{
public Guid id { get; set; }
public string name { get; set; }
public int click { get; set; } = 10;
public DateTime createtime { get; set; } = DateTime.Now;
}
class TestQueryableLinqToSqlComment
{
public Guid id { get; set; }
public Guid TestLinqToSqlId { get; set; }
public TestQueryableLinqToSql TEstLinqToSql { get; set; }
public string text { get; set; }
public DateTime createtime { get; set; } = DateTime.Now;
}
public class QueryableLinqToSqlTests
{
[Fact]
public void Where()
{
var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
where a.id == item.id
select a).ToList();
Assert.True(t1.Any());
Assert.Equal(item.id, t1[0].id);
}
[Fact]
public void Select()
{
var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
where a.id == item.id
select new { a.id }).ToList();
Assert.True(t1.Any());
Assert.Equal(item.id, t1[0].id);
}
[Fact]
public void GroupBy()
{
//var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
//g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
//var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
// where a.id == item.id
// group a by new { a.id, a.name } into g
// select new
// {
// g.Key.id,
// g.Key.name,
// cou = g.Count(),
// avg = g.Average(x => x.click),
// sum = g.Sum(x => x.click),
// max = g.Max(x => x.click),
// min = g.Min(x => x.click)
// }).ToList();
//Assert.True(t1.Any());
//Assert.Equal(item.id, t1.First().id);
}
[Fact]
public void CaseWhen()
{
var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
where a.id == item.id
select new
{
a.id,
a.name,
testsub = new
{
time = a.click > 10 ? "<22><><EFBFBD><EFBFBD>" : "С<>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>"
}
}).ToList();
Assert.True(t1.Any());
Assert.Equal(item.id, t1[0].id);
Assert.Equal("С<>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>", t1[0].testsub.time);
}
[Fact]
public void Join()
{
var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
var comment = new TestQueryableLinqToSqlComment { TestLinqToSqlId = item.id, text = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSqlComment>().AppendData(comment).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
join b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable() on a.id equals b.TestLinqToSqlId
select a).ToList();
Assert.True(t1.Any());
//Assert.Equal(item.id, t1[0].id);
var t2 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
join b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable() on a.id equals b.TestLinqToSqlId
select new { a.id, bid = b.id }).ToList();
Assert.True(t2.Any());
//Assert.Equal(item.id, t2[0].id);
//Assert.Equal(comment.id, t2[0].bid);
var t3 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
join b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable() on a.id equals b.TestLinqToSqlId
where a.id == item.id
select new { a.id, bid = b.id }).ToList();
Assert.True(t3.Any());
Assert.Equal(item.id, t3[0].id);
Assert.Equal(comment.id, t3[0].bid);
}
[Fact]
public void LeftJoin()
{
var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
var comment = new TestQueryableLinqToSqlComment { TestLinqToSqlId = item.id, text = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSqlComment>().AppendData(comment).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
join b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable() on a.id equals b.TestLinqToSqlId into temp
from tc in temp.DefaultIfEmpty()
select a).ToList();
Assert.True(t1.Any());
//Assert.Equal(item.id, t1[0].id);
var t2 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
join b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable() on a.id equals b.TestLinqToSqlId into temp
from tc in temp.DefaultIfEmpty()
select new { a.id, bid = tc.id }).ToList();
Assert.True(t2.Any());
//Assert.Equal(item.id, t2[0].id);
//Assert.Equal(comment.id, t2[0].bid);
var t3 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
join b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable() on a.id equals b.TestLinqToSqlId into temp
from tc in temp.DefaultIfEmpty()
where a.id == item.id
select new { a.id, bid = tc.id }).ToList();
Assert.True(t3.Any());
Assert.Equal(item.id, t3[0].id);
Assert.Equal(comment.id, t3[0].bid);
}
[Fact]
public void From()
{
var item = new TestQueryableLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSql>().AppendData(item).ExecuteAffrows();
var comment = new TestQueryableLinqToSqlComment { TestLinqToSqlId = item.id, text = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestQueryableLinqToSqlComment>().AppendData(comment).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
from b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable()
where a.id == b.TestLinqToSqlId
select a).ToList();
Assert.True(t1.Any());
//Assert.Equal(item.id, t1[0].id);
var t2 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
from b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable()
where a.id == b.TestLinqToSqlId
select new { a.id, bid = b.id }).ToList();
Assert.True(t2.Any());
//Assert.Equal(item.id, t2[0].id);
//Assert.Equal(comment.id, t2[0].bid);
var t3 = (from a in g.sqlite.Select<TestQueryableLinqToSql>().AsQueryable()
from b in g.sqlite.Select<TestQueryableLinqToSqlComment>().AsQueryable()
where a.id == b.TestLinqToSqlId
where a.id == item.id
select new { a.id, bid = b.id }).ToList();
Assert.True(t3.Any());
Assert.Equal(item.id, t3[0].id);
Assert.Equal(comment.id, t3[0].bid);
}
}
}

View File

@ -17,7 +17,7 @@ using System.Diagnostics;
using System.IO;
using System.Text;
namespace FreeSql.Tests
namespace FreeSql.Tests.Linq
{
public class QueryableTest
{
@ -66,6 +66,126 @@ namespace FreeSql.Tests
Assert.True(fsql.Select<qt01>().AsQueryable().Any(a => a.id == sd[0].id));
Assert.False(fsql.Select<qt01>().AsQueryable().Any(a => a.id == sd[0].id && sd[0].id == 0));
}
[Fact]
public void Max()
{
var avg = fsql.Select<qt01>().AsQueryable().Max(a => a.id);
Assert.True(avg > 0);
}
[Fact]
public void Min()
{
var avg = fsql.Select<qt01>().AsQueryable().Min(a => a.id);
Assert.True(avg > 0);
}
[Fact]
public void Sum()
{
var avg = fsql.Select<qt01>().AsQueryable().Sum(a => a.id);
Assert.True(avg > 0);
}
[Fact]
public void Average()
{
var avg = fsql.Select<qt01>().AsQueryable().Average(a => a.id);
Assert.True(avg > 0);
}
[Fact]
public void Contains()
{
Assert.True(fsql.Select<qt01>().AsQueryable().Contains(new qt01 { id = 1 }));
Assert.False(fsql.Select<qt01>().AsQueryable().Contains(new qt01 { id = 0 }));
}
[Fact]
public void Distinct()
{
fsql.Select<qt01>().AsQueryable().Distinct().Select(a => a.name).ToList();
}
[Fact]
public void ElementAt()
{
Assert.Equal(fsql.Select<qt01>().Skip(1).First().id, fsql.Select<qt01>().AsQueryable().ElementAt(1).id);
Assert.Equal(fsql.Select<qt01>().Skip(2).First().id, fsql.Select<qt01>().AsQueryable().ElementAt(2).id);
Assert.Equal(fsql.Select<qt01>().Skip(1).First().id, fsql.Select<qt01>().AsQueryable().ElementAtOrDefault(1).id);
Assert.Equal(fsql.Select<qt01>().Skip(2).First().id, fsql.Select<qt01>().AsQueryable().ElementAtOrDefault(2).id);
}
[Fact]
public void First()
{
Assert.Equal(fsql.Select<qt01>().First().id, fsql.Select<qt01>().AsQueryable().First().id);
Assert.Equal(fsql.Select<qt01>().First().id, fsql.Select<qt01>().AsQueryable().FirstOrDefault().id);
}
[Fact]
public void Single()
{
Assert.Equal(fsql.Select<qt01>().First().id, fsql.Select<qt01>().AsQueryable().Single().id);
Assert.Equal(fsql.Select<qt01>().First().id, fsql.Select<qt01>().AsQueryable().SingleOrDefault().id);
}
[Fact]
public void OrderBy()
{
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).Single().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).SingleOrDefault().id);
}
[Fact]
public void OrderByDescending()
{
Assert.Equal(fsql.Select<qt01>().OrderByDescending(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderByDescending(a => a.id).Single().id);
Assert.Equal(fsql.Select<qt01>().OrderByDescending(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderByDescending(a => a.id).SingleOrDefault().id);
}
[Fact]
public void ThenBy()
{
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderBy(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).OrderBy(a => a.id).Single().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderBy(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).OrderBy(a => a.id).SingleOrDefault().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderBy(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).ThenBy(a => a.id).Single().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderBy(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).ThenBy(a => a.id).SingleOrDefault().id);
}
[Fact]
public void ThenByDescending()
{
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderByDescending(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).OrderByDescending(a => a.id).Single().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderByDescending(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).OrderByDescending(a => a.id).SingleOrDefault().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderByDescending(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).ThenByDescending(a => a.id).Single().id);
Assert.Equal(fsql.Select<qt01>().OrderBy(a => a.id).OrderByDescending(a => a.id).First().id, fsql.Select<qt01>().AsQueryable().OrderBy(a => a.id).ThenByDescending(a => a.id).SingleOrDefault().id);
}
[Fact]
public void Select()
{
Assert.Equal(fsql.Select<qt01>().First(a => a.name), fsql.Select<qt01>().AsQueryable().Select(a => a.name).Single());
Assert.Equal(fsql.Select<qt01>().First(a => new { a.name }).name, fsql.Select<qt01>().AsQueryable().Select(a => new { a.name }).Single().name);
}
[Fact]
public void Where()
{
Assert.Equal(fsql.Select<qt01>().First(a => a.name), fsql.Select<qt01>().AsQueryable().Select(a => a.name).Single());
Assert.Equal(fsql.Select<qt01>().First(a => new { a.name }).name, fsql.Select<qt01>().AsQueryable().Select(a => new { a.name }).Single().name);
}
[Fact]
public void Skip()
{
Assert.Equal(fsql.Select<qt01>().Skip(2).First(a => a.name), fsql.Select<qt01>().AsQueryable().Skip(2).Select(a => a.name).Single());
Assert.Equal(fsql.Select<qt01>().Skip(2).First(a => new { a.name }).name, fsql.Select<qt01>().AsQueryable().Skip(2).Select(a => new { a.name }).Single().name);
}
[Fact]
public void Take()
{
Assert.Equal(fsql.Select<qt01>().Skip(2).First(a => a.name), fsql.Select<qt01>().AsQueryable().Skip(2).Take(1).Select(a => a.name).ToList().FirstOrDefault());
Assert.Equal(fsql.Select<qt01>().Skip(2).First(a => new { a.name }).name, fsql.Select<qt01>().AsQueryable().Skip(2).Take(1).Select(a => new { a.name }).ToList().FirstOrDefault().name);
}
}
}