- 优化 导航集合属性访问,可省略 AsSelect;#15 #300 #362 #509 #698 #644 #903

This commit is contained in:
2881099
2022-04-27 20:27:24 +08:00
parent dcf7b9668f
commit f76a46f383
20 changed files with 1947 additions and 346 deletions

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
@ -91,35 +91,166 @@ namespace FreeSql.Tests.MySqlConnector
[Fact]
public void AsSelect()
{
var fsql = g.mysql;
//OneToOne、ManyToOne
var t0 = g.mysql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
WHERE (a__Parent__Parent.`Name` = '粤语')", t0);
//OneToMany
var t1 = g.mysql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
limit 0,1))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a__Parent.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a__Parent.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (((a.`Name`) in (SELECT t.`Name` as1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a__Parent.`Id`) AND (t__Parent.`Id` = 10))))", t15);
//ManyToMany
var t2 = g.mysql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE (exists(SELECT 1
FROM `Song_tag` Mt_Ms
WHERE (Mt_Ms.`Song_id` = a.`Id`) AND (exists(SELECT 1
FROM `Tag` t
WHERE (t.`Name` = '国语') AND (t.`Id` = Mt_Ms.`Tag_id`)
limit 0,1))
limit 0,1))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE (exists(SELECT 1
FROM `Tag` t
WHERE (exists(SELECT 1
FROM `Song_tag` Mt_Ma
WHERE (Mt_Ma.`Tag_id` = t.`Id`) AND (Mt_Ma.`Song_id` = a.`Id`)
limit 0,1)) AND (t.`Name` = '国语')
limit 0,1))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE (exists(SELECT 1
FROM `Tag` t
WHERE (exists(SELECT 1
FROM `Song_tag` Mt_Ma
WHERE (Mt_Ma.`Tag_id` = t.`Id`) AND (Mt_Ma.`Song_id` = a.`Id`)
limit 0,1)) AND (t.`Name` = '国语')
limit 0,1))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Song` s
WHERE (exists(SELECT 1
FROM `Song_tag` Ms_Ma__Parent
WHERE (Ms_Ma__Parent.`Song_id` = s.`Id`) AND (Ms_Ma__Parent.`Tag_id` = a__Parent.`Id`)
limit 0,1)) AND (s.`Title` = '中国人')
limit 0,1))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Song` s
WHERE (exists(SELECT 1
FROM `Song_tag` Ms_Ma__Parent
WHERE (Ms_Ma__Parent.`Song_id` = s.`Id`) AND (Ms_Ma__Parent.`Tag_id` = a__Parent.`Id`)
limit 0,1)) AND (s.`Title` = '中国人')
limit 0,1))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (((a.`Name`) in (SELECT s.`Title` as1
FROM `Song` s
WHERE (exists(SELECT 1
FROM `Song_tag` Ms_Ma__Parent
WHERE (Ms_Ma__Parent.`Song_id` = s.`Id`) AND (Ms_Ma__Parent.`Tag_id` = a__Parent.`Id`)
limit 0,1)) AND (s.`Title` = '中国人'))))", t25);
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
@ -83,35 +83,150 @@ namespace FreeSql.Tests.Dameng
[Fact]
public void AsSelect()
{
var fsql = g.dameng;
//OneToOne、ManyToOne
var t0 = g.dameng.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
LEFT JOIN ""TAG"" a__Parent__Parent ON a__Parent__Parent.""ID"" = a__Parent.""PARENT_ID""
WHERE (a__Parent__Parent.""NAME"" = '粤语')", t0);
//OneToMany
var t1 = g.dameng.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t__Parent.""ID"" = 10) AND (t.""PARENT_ID"" = a.""ID"")))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a.""ID"") AND (t__Parent.""ID"" = 10)))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10)))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a.""ID"") AND (t__Parent.""ID"" = 10)))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10)))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (((a.""NAME"") in (SELECT t.""NAME"" as1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10))))", t15);
//ManyToMany
var t2 = g.dameng.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Mt_Ms
WHERE (Mt_Ms.""SONG_ID"" = a.""ID"") AND (exists(SELECT 1
FROM ""TAG"" t
WHERE (t.""NAME"" = '国语') AND (t.""ID"" = Mt_Ms.""TAG_ID"")))))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Mt_Ma
WHERE (Mt_Ma.""TAG_ID"" = t.""ID"") AND (Mt_Ma.""SONG_ID"" = a.""ID""))) AND (t.""NAME"" = '国语')))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Mt_Ma
WHERE (Mt_Ma.""TAG_ID"" = t.""ID"") AND (Mt_Ma.""SONG_ID"" = a.""ID""))) AND (t.""NAME"" = '国语')))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""SONG"" s
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人')))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""SONG"" s
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人')))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
FROM ""SONG"" s
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人'))))", t25);
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
@ -83,35 +83,150 @@ namespace FreeSql.Tests.Firebird
[Fact]
public void AsSelect()
{
var fsql = g.firebird;
//OneToOne、ManyToOne
var t0 = g.firebird.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
LEFT JOIN ""TAG"" a__Parent__Parent ON a__Parent__Parent.""ID"" = a__Parent.""PARENT_ID""
WHERE (a__Parent__Parent.""NAME"" = '粤语')", t0);
//OneToMany
var t1 = g.firebird.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t__Parent.""ID"" = 10) AND (t.""PARENT_ID"" = a.""ID"")))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a.""ID"") AND (t__Parent.""ID"" = 10)))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10)))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a.""ID"") AND (t__Parent.""ID"" = 10)))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10)))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (((a.""NAME"") in (SELECT t.""NAME"" as1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10))))", t15);
//ManyToMany
var t2 = g.firebird.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG_TAG"" Mt_Ms
WHERE (Mt_Ms.""SONG_ID"" = a.""ID"") AND (exists(SELECT FIRST 1 1
FROM ""TAG"" t
WHERE (t.""NAME"" = '国语') AND (t.""ID"" = Mt_Ms.""TAG_ID"")))))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG_TAG"" Mt_Ma
WHERE (Mt_Ma.""TAG_ID"" = t.""ID"") AND (Mt_Ma.""SONG_ID"" = a.""ID""))) AND (t.""NAME"" = '国语')))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT FIRST 1 1
FROM ""TAG"" t
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG_TAG"" Mt_Ma
WHERE (Mt_Ma.""TAG_ID"" = t.""ID"") AND (Mt_Ma.""SONG_ID"" = a.""ID""))) AND (t.""NAME"" = '国语')))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG"" s
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人')))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG"" s
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人')))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
FROM ""SONG"" s
WHERE (exists(SELECT FIRST 1 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人'))))", t25);
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -26,16 +26,16 @@ namespace FreeSql.Tests.Linq
[Fact]
public void GetConstExprValue()
{
Assert.Equal(-1, ExprHelper.GetConstExprValue(Expression.Constant(-1)));
Assert.Equal(-2, ExprHelper.GetConstExprValue(Expression.Constant(-2)));
Assert.Equal(0, ExprHelper.GetConstExprValue(Expression.Constant(0)));
Assert.Equal(1, ExprHelper.GetConstExprValue(Expression.Constant(1)));
Assert.Equal(2, ExprHelper.GetConstExprValue(Expression.Constant(2)));
Assert.Equal(-1, Expression.Constant(-1).GetConstExprValue());
Assert.Equal(-2, Expression.Constant(-2).GetConstExprValue());
Assert.Equal(0, Expression.Constant(0).GetConstExprValue());
Assert.Equal(1, Expression.Constant(1).GetConstExprValue());
Assert.Equal(2, Expression.Constant(2).GetConstExprValue());
var arr = new[] { -1, -2, 0, 1, 2 };
for (var a = 0; a < arr.Length; a++)
{
Assert.Equal(arr[a], ExprHelper.GetConstExprValue(Expression.Constant(arr[a])));
Assert.Equal(arr[a], Expression.Constant(arr[a]).GetConstExprValue());
}
var arritems = new[]
@ -48,8 +48,8 @@ namespace FreeSql.Tests.Linq
};
for (var a = 0; a < arr.Length; a++)
{
Assert.Equal(arritems[a].Prop, ExprHelper.GetConstExprValue(Expression.Constant(arritems[a].Prop)));
Assert.Equal(arritems[a].Field, ExprHelper.GetConstExprValue(Expression.Constant(arritems[a].Field)));
Assert.Equal(arritems[a].Prop, Expression.Constant(arritems[a].Prop).GetConstExprValue());
Assert.Equal(arritems[a].Field, Expression.Constant(arritems[a].Field).GetConstExprValue());
}
}

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
@ -72,35 +72,150 @@ namespace FreeSql.Tests.MsAccess
[Fact]
public void AsSelect()
{
var fsql = g.msaccess;
//OneToOne、ManyToOne
var t0 = g.msaccess.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
//FROM [Tag] a
//LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
//LEFT JOIN [Tag] a__Parent__Parent ON a__Parent__Parent.[Id] = a__Parent.[Parent_id]
//WHERE (a__Parent__Parent.[Name] = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM ([Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id]))
LEFT JOIN [Tag] a__Parent__Parent ON (a__Parent__Parent.[Id] = a__Parent.[Parent_id])
WHERE (a__Parent__Parent.[Name] = '粤语')", t0);
//OneToMany
var t1 = g.msaccess.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
//FROM [Tag] a
//WHERE (exists(SELECT 1
// FROM [Tag] t
// LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
// WHERE (t__Parent.[Id] = 10) AND (t.[Parent_id] = a.[Id])
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
FROM [Tag] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON (t__Parent.[Id] = t.[Parent_id])
WHERE (t__Parent.[Id] = 10) AND (t.[Parent_id] = a.[Id])))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
FROM [Tag] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON (t__Parent.[Id] = t.[Parent_id])
WHERE (t.[Parent_id] = a.[Id]) AND (t__Parent.[Id] = 10)))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id])
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON (t__Parent.[Id] = t.[Parent_id])
WHERE (t.[Parent_id] = a__Parent.[Id]) AND (t__Parent.[Id] = 10)))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
FROM [Tag] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON (t__Parent.[Id] = t.[Parent_id])
WHERE (t.[Parent_id] = a.[Id]) AND (t__Parent.[Id] = 10)))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id])
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON (t__Parent.[Id] = t.[Parent_id])
WHERE (t.[Parent_id] = a__Parent.[Id]) AND (t__Parent.[Id] = 10)))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id])
WHERE (((a.[Name]) in (SELECT t.[Name] as as1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON (t__Parent.[Id] = t.[Parent_id])
WHERE (t.[Parent_id] = a__Parent.[Id]) AND (t__Parent.[Id] = 10))))", t15);
//ManyToMany
var t2 = g.msaccess.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
//FROM [Song] a
//WHERE(exists(SELECT 1
// FROM [Song_tag] Mt_Ms
// WHERE(Mt_Ms.[Song_id] = a.[Id]) AND(exists(SELECT 1
// FROM [Tag] t
// WHERE(t.[Name] = '国语') AND(t.[Id] = Mt_Ms.[Tag_id])
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
FROM [Song] a
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Mt_Ms
WHERE (Mt_Ms.[Song_id] = a.[Id]) AND (exists(SELECT TOP 1 1
FROM [Tag] t
WHERE (t.[Name] = '国语') AND (t.[Id] = Mt_Ms.[Tag_id])))))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
FROM [Song] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Mt_Ma
WHERE (Mt_Ma.[Tag_id] = t.[Id]) AND (Mt_Ma.[Song_id] = a.[Id]))) AND (t.[Name] = '国语')))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
FROM [Song] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Mt_Ma
WHERE (Mt_Ma.[Tag_id] = t.[Id]) AND (Mt_Ma.[Song_id] = a.[Id]))) AND (t.[Name] = '国语')))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id])
WHERE (exists(SELECT TOP 1 1
FROM [Song] s
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Ms_Ma__Parent
WHERE (Ms_Ma__Parent.[Song_id] = s.[Id]) AND (Ms_Ma__Parent.[Tag_id] = a__Parent.[Id]))) AND (s.[Title] = '中国人')))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id])
WHERE (exists(SELECT TOP 1 1
FROM [Song] s
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Ms_Ma__Parent
WHERE (Ms_Ma__Parent.[Song_id] = s.[Id]) AND (Ms_Ma__Parent.[Tag_id] = a__Parent.[Id]))) AND (s.[Title] = '中国人')))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as as3, a__Parent.[Parent_id] as as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as as7, a.[Name] as as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON (a__Parent.[Id] = a.[Parent_id])
WHERE (((a.[Name]) in (SELECT s.[Title] as as1
FROM [Song] s
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Ms_Ma__Parent
WHERE (Ms_Ma__Parent.[Song_id] = s.[Id]) AND (Ms_Ma__Parent.[Tag_id] = a__Parent.[Id]))) AND (s.[Title] = '中国人'))))", t25);
var t3 = fsql.Select<Song>().First(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using FreeSql.Internal.CommonProvider;
using Newtonsoft.Json;
using System;
@ -93,35 +93,166 @@ namespace FreeSql.Tests.MySql
[Fact]
public void AsSelect()
{
var fsql = g.mysql;
//OneToOne、ManyToOne
var t0 = g.mysql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
WHERE (a__Parent__Parent.`Name` = '粤语')", t0);
//OneToMany
var t1 = g.mysql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
limit 0,1))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a__Parent.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a__Parent.`Id`) AND (t__Parent.`Id` = 10)
limit 0,1))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (((a.`Name`) in (SELECT t.`Name` as1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t.`Parent_id` = a__Parent.`Id`) AND (t__Parent.`Id` = 10))))", t15);
//ManyToMany
var t2 = g.mysql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE (exists(SELECT 1
FROM `Song_tag` Mt_Ms
WHERE (Mt_Ms.`Song_id` = a.`Id`) AND (exists(SELECT 1
FROM `Tag` t
WHERE (t.`Name` = '国语') AND (t.`Id` = Mt_Ms.`Tag_id`)
limit 0,1))
limit 0,1))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE (exists(SELECT 1
FROM `Tag` t
WHERE (exists(SELECT 1
FROM `Song_tag` Mt_Ma
WHERE (Mt_Ma.`Tag_id` = t.`Id`) AND (Mt_Ma.`Song_id` = a.`Id`)
limit 0,1)) AND (t.`Name` = '国语')
limit 0,1))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE (exists(SELECT 1
FROM `Tag` t
WHERE (exists(SELECT 1
FROM `Song_tag` Mt_Ma
WHERE (Mt_Ma.`Tag_id` = t.`Id`) AND (Mt_Ma.`Song_id` = a.`Id`)
limit 0,1)) AND (t.`Name` = '国语')
limit 0,1))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Song` s
WHERE (exists(SELECT 1
FROM `Song_tag` Ms_Ma__Parent
WHERE (Ms_Ma__Parent.`Song_id` = s.`Id`) AND (Ms_Ma__Parent.`Tag_id` = a__Parent.`Id`)
limit 0,1)) AND (s.`Title` = '中国人')
limit 0,1))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (exists(SELECT 1
FROM `Song` s
WHERE (exists(SELECT 1
FROM `Song_tag` Ms_Ma__Parent
WHERE (Ms_Ma__Parent.`Song_id` = s.`Id`) AND (Ms_Ma__Parent.`Tag_id` = a__Parent.`Id`)
limit 0,1)) AND (s.`Title` = '中国人')
limit 0,1))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
WHERE (((a.`Name`) in (SELECT s.`Title` as1
FROM `Song` s
WHERE (exists(SELECT 1
FROM `Song_tag` Ms_Ma__Parent
WHERE (Ms_Ma__Parent.`Song_id` = s.`Id`) AND (Ms_Ma__Parent.`Tag_id` = a__Parent.`Id`)
limit 0,1)) AND (s.`Title` = '中国人'))))", t25);
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
@ -83,35 +83,150 @@ namespace FreeSql.Tests.Oracle
[Fact]
public void AsSelect()
{
var fsql = g.oracle;
//OneToOne、ManyToOne
var t0 = g.oracle.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
LEFT JOIN ""TAG"" a__Parent__Parent ON a__Parent__Parent.""ID"" = a__Parent.""PARENT_ID""
WHERE (a__Parent__Parent.""NAME"" = '粤语')", t0);
//OneToMany
var t1 = g.oracle.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t__Parent.""ID"" = 10) AND (t.""PARENT_ID"" = a.""ID"")))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a.""ID"") AND (t__Parent.""ID"" = 10)))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10)))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a.""DDD"", a.""NAME""
FROM ""TAG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a.""ID"") AND (t__Parent.""ID"" = 10)))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10)))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (((a.""NAME"") in (SELECT t.""NAME"" as1
FROM ""TAG"" t
LEFT JOIN ""TAG"" t__Parent ON t__Parent.""ID"" = t.""PARENT_ID""
WHERE (t.""PARENT_ID"" = a__Parent.""ID"") AND (t__Parent.""ID"" = 10))))", t15);
//ManyToMany
var t2 = g.oracle.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Mt_Ms
WHERE (Mt_Ms.""SONG_ID"" = a.""ID"") AND (exists(SELECT 1
FROM ""TAG"" t
WHERE (t.""NAME"" = '国语') AND (t.""ID"" = Mt_Ms.""TAG_ID"")))))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Mt_Ma
WHERE (Mt_Ma.""TAG_ID"" = t.""ID"") AND (Mt_Ma.""SONG_ID"" = a.""ID""))) AND (t.""NAME"" = '国语')))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""CREATE_TIME"", a.""IS_DELETED"", a.""TITLE"", a.""URL""
FROM ""SONG"" a
WHERE (exists(SELECT 1
FROM ""TAG"" t
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Mt_Ma
WHERE (Mt_Ma.""TAG_ID"" = t.""ID"") AND (Mt_Ma.""SONG_ID"" = a.""ID""))) AND (t.""NAME"" = '国语')))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""SONG"" s
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人')))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (exists(SELECT 1
FROM ""SONG"" s
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人')))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.""ID"", a.""PARENT_ID"", a__Parent.""ID"" as3, a__Parent.""PARENT_ID"" as4, a__Parent.""DDD"", a__Parent.""NAME"", a.""DDD"" as7, a.""NAME"" as8
FROM ""TAG"" a
LEFT JOIN ""TAG"" a__Parent ON a__Parent.""ID"" = a.""PARENT_ID""
WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
FROM ""SONG"" s
WHERE (exists(SELECT 1
FROM ""SONG_TAG"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""SONG_ID"" = s.""ID"") AND (Ms_Ma__Parent.""TAG_ID"" = a__Parent.""ID""))) AND (s.""TITLE"" = '中国人'))))", t25);
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
@ -73,35 +73,166 @@ namespace FreeSql.Tests.PostgreSQL
[Fact]
public void AsSelect()
{
var fsql = g.pgsql;
//OneToOne、ManyToOne
var t0 = g.pgsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
LEFT JOIN ""tag"" a__Parent__Parent ON a__Parent__Parent.""id"" = a__Parent.""parent_id""
WHERE (a__Parent__Parent.""name"" = '粤语')", t0);
//OneToMany
var t1 = g.pgsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a.""ddd"", a.""name""
FROM ""tag"" a
WHERE (exists(SELECT 1
FROM ""tag"" t
LEFT JOIN ""tag"" t__Parent ON t__Parent.""id"" = t.""parent_id""
WHERE (t__Parent.""id"" = 10) AND (t.""parent_id"" = a.""id"")
limit 1))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a.""ddd"", a.""name""
FROM ""tag"" a
WHERE (exists(SELECT 1
FROM ""tag"" t
LEFT JOIN ""tag"" t__Parent ON t__Parent.""id"" = t.""parent_id""
WHERE (t.""parent_id"" = a.""id"") AND (t__Parent.""id"" = 10)
limit 1))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
WHERE (exists(SELECT 1
FROM ""tag"" t
LEFT JOIN ""tag"" t__Parent ON t__Parent.""id"" = t.""parent_id""
WHERE (t.""parent_id"" = a__Parent.""id"") AND (t__Parent.""id"" = 10)
limit 1))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a.""ddd"", a.""name""
FROM ""tag"" a
WHERE (exists(SELECT 1
FROM ""tag"" t
LEFT JOIN ""tag"" t__Parent ON t__Parent.""id"" = t.""parent_id""
WHERE (t.""parent_id"" = a.""id"") AND (t__Parent.""id"" = 10)
limit 1))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
WHERE (exists(SELECT 1
FROM ""tag"" t
LEFT JOIN ""tag"" t__Parent ON t__Parent.""id"" = t.""parent_id""
WHERE (t.""parent_id"" = a__Parent.""id"") AND (t__Parent.""id"" = 10)
limit 1))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
WHERE (((a.""name"") in (SELECT t.""name"" as1
FROM ""tag"" t
LEFT JOIN ""tag"" t__Parent ON t__Parent.""id"" = t.""parent_id""
WHERE (t.""parent_id"" = a__Parent.""id"") AND (t__Parent.""id"" = 10))))", t15);
//ManyToMany
var t2 = g.pgsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""id"", a.""create_time"", a.""is_deleted"", a.""title"", a.""url""
FROM ""song"" a
WHERE (exists(SELECT 1
FROM ""song_tag"" Mt_Ms
WHERE (Mt_Ms.""song_id"" = a.""id"") AND (exists(SELECT 1
FROM ""tag"" t
WHERE (t.""name"" = '国语') AND (t.""id"" = Mt_Ms.""tag_id"")
limit 1))
limit 1))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""id"", a.""create_time"", a.""is_deleted"", a.""title"", a.""url""
FROM ""song"" a
WHERE (exists(SELECT 1
FROM ""tag"" t
WHERE (exists(SELECT 1
FROM ""song_tag"" Mt_Ma
WHERE (Mt_Ma.""tag_id"" = t.""id"") AND (Mt_Ma.""song_id"" = a.""id"")
limit 1)) AND (t.""name"" = '国语')
limit 1))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.""id"", a.""create_time"", a.""is_deleted"", a.""title"", a.""url""
FROM ""song"" a
WHERE (exists(SELECT 1
FROM ""tag"" t
WHERE (exists(SELECT 1
FROM ""song_tag"" Mt_Ma
WHERE (Mt_Ma.""tag_id"" = t.""id"") AND (Mt_Ma.""song_id"" = a.""id"")
limit 1)) AND (t.""name"" = '国语')
limit 1))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
WHERE (exists(SELECT 1
FROM ""song"" s
WHERE (exists(SELECT 1
FROM ""song_tag"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""song_id"" = s.""id"") AND (Ms_Ma__Parent.""tag_id"" = a__Parent.""id"")
limit 1)) AND (s.""title"" = '中国人')
limit 1))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
WHERE (exists(SELECT 1
FROM ""song"" s
WHERE (exists(SELECT 1
FROM ""song_tag"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""song_id"" = s.""id"") AND (Ms_Ma__Parent.""tag_id"" = a__Parent.""id"")
limit 1)) AND (s.""title"" = '中国人')
limit 1))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.""id"", a.""parent_id"", a__Parent.""id"" as3, a__Parent.""parent_id"" as4, a__Parent.""ddd"", a__Parent.""name"", a.""ddd"" as7, a.""name"" as8
FROM ""tag"" a
LEFT JOIN ""tag"" a__Parent ON a__Parent.""id"" = a.""parent_id""
WHERE (((a.""name"") in (SELECT s.""title"" as1
FROM ""song"" s
WHERE (exists(SELECT 1
FROM ""song_tag"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""song_id"" = s.""id"") AND (Ms_Ma__Parent.""tag_id"" = a__Parent.""id"")
limit 1)) AND (s.""title"" = '中国人'))))", t25);
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}
[Fact]

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using FreeSql.Tests.DataContext.SqlServer;
using NetTaste;
using System;
@ -83,40 +83,145 @@ namespace FreeSql.Tests.SqlServer
[Fact]
public void AsSelect()
{
var fsql = g.sqlserver;
//OneToOne、ManyToOne
var t0 = g.sqlserver.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
//FROM [Tag] a
//LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
//LEFT JOIN [Tag] a__Parent__Parent ON a__Parent__Parent.[Id] = a__Parent.[Parent_id]
//WHERE (a__Parent__Parent.[Name] = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
//Assert.Equal(@"", t0);
//OneToMany
var t1 = g.sqlserver.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
//FROM [Tag] a
//WHERE (exists(SELECT 1
// FROM [Tag] t
// LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
// WHERE (t__Parent.[Id] = 10) AND (t.[Parent_id] = a.[Id])
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
FROM [Tag] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
WHERE (t__Parent.[Id] = 10) AND (t.[Parent_id] = a.[Id])))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
FROM [Tag] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
WHERE (t.[Parent_id] = a.[Id]) AND (t__Parent.[Id] = 10)))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
WHERE (t.[Parent_id] = a__Parent.[Id]) AND (t__Parent.[Id] = 10)))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a.[Ddd], a.[Name]
FROM [Tag] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
WHERE (t.[Parent_id] = a.[Id]) AND (t__Parent.[Id] = 10)))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
WHERE (t.[Parent_id] = a__Parent.[Id]) AND (t__Parent.[Id] = 10)))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
WHERE (((a.[Name]) in (SELECT t.[Name] as1
FROM [Tag] t
LEFT JOIN [Tag] t__Parent ON t__Parent.[Id] = t.[Parent_id]
WHERE (t.[Parent_id] = a__Parent.[Id]) AND (t__Parent.[Id] = 10))))", t15);
//ManyToMany
var t2 = g.sqlserver.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
//FROM [Song] a
//WHERE(exists(SELECT 1
// FROM [Song_tag] Mt_Ms
// WHERE(Mt_Ms.[Song_id] = a.[Id]) AND(exists(SELECT 1
// FROM [Tag] t
// WHERE(t.[Name] = '国语') AND(t.[Id] = Mt_Ms.[Tag_id])
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
FROM [Song] a
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Mt_Ms
WHERE (Mt_Ms.[Song_id] = a.[Id]) AND (exists(SELECT TOP 1 1
FROM [Tag] t
WHERE (t.[Name] = N'国语') AND (t.[Id] = Mt_Ms.[Tag_id])))))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
FROM [Song] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Mt_Ma
WHERE (Mt_Ma.[Tag_id] = t.[Id]) AND (Mt_Ma.[Song_id] = a.[Id]))) AND (t.[Name] = N'国语')))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Create_time], a.[Is_deleted], a.[Title], a.[Url]
FROM [Song] a
WHERE (exists(SELECT TOP 1 1
FROM [Tag] t
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Mt_Ma
WHERE (Mt_Ma.[Tag_id] = t.[Id]) AND (Mt_Ma.[Song_id] = a.[Id]))) AND (t.[Name] = N'国语')))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
WHERE (exists(SELECT TOP 1 1
FROM [Song] s
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Ms_Ma__Parent
WHERE (Ms_Ma__Parent.[Song_id] = s.[Id]) AND (Ms_Ma__Parent.[Tag_id] = a__Parent.[Id]))) AND (s.[Title] = N'中国人')))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
WHERE (exists(SELECT TOP 1 1
FROM [Song] s
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Ms_Ma__Parent
WHERE (Ms_Ma__Parent.[Song_id] = s.[Id]) AND (Ms_Ma__Parent.[Tag_id] = a__Parent.[Id]))) AND (s.[Title] = N'中国人')))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.[Id], a.[Parent_id], a__Parent.[Id] as3, a__Parent.[Parent_id] as4, a__Parent.[Ddd], a__Parent.[Name], a.[Ddd] as7, a.[Name] as8
FROM [Tag] a
LEFT JOIN [Tag] a__Parent ON a__Parent.[Id] = a.[Parent_id]
WHERE (((a.[Name]) in (SELECT s.[Title] as1
FROM [Song] s
WHERE (exists(SELECT TOP 1 1
FROM [Song_tag] Ms_Ma__Parent
WHERE (Ms_Ma__Parent.[Song_id] = s.[Id]) AND (Ms_Ma__Parent.[Tag_id] = a__Parent.[Id]))) AND (s.[Title] = N'中国人'))))", t25);
var t3 = g.sqlserver.Select<Song>().ToList(r => new
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
count = r.Tags.AsSelect().Count()
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations;
using FreeSql.DataAnnotations;
using FreeSql.Internal.Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@ -81,45 +81,165 @@ namespace FreeSql.Tests.Sqlite
[Fact]
public void AsSelect()
{
var fsql = g.sqlite;
//OneToOne、ManyToOne
var t0 = g.sqlite.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
//FROM `Tag` a
//LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
//LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
//WHERE (a__Parent__Parent.`Name` = '粤语')
var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
LEFT JOIN ""Tag"" a__Parent__Parent ON a__Parent__Parent.""Id"" = a__Parent.""Parent_id""
WHERE (a__Parent__Parent.""Name"" = '粤语')", t0);
//OneToMany
var t1 = g.sqlite.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
//SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
//FROM `Tag` a
//WHERE (exists(SELECT 1
// FROM `Tag` t
// LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
// WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
// limit 0,1))
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a.""Ddd"", a.""Name""
FROM ""Tag"" a
WHERE (exists(SELECT 1
FROM ""Tag"" t
LEFT JOIN ""Tag"" t__Parent ON t__Parent.""Id"" = t.""Parent_id""
WHERE (t__Parent.""Id"" = 10) AND (t.""Parent_id"" = a.""Id"")
limit 0,1))", t1);
var t11 = fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a.""Ddd"", a.""Name""
FROM ""Tag"" a
WHERE (exists(SELECT 1
FROM ""Tag"" t
LEFT JOIN ""Tag"" t__Parent ON t__Parent.""Id"" = t.""Parent_id""
WHERE (t.""Parent_id"" = a.""Id"") AND (t__Parent.""Id"" = 10)
limit 0,1))", t11);
var t12 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Any(t => t.Parent.Id == 10)).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
WHERE (exists(SELECT 1
FROM ""Tag"" t
LEFT JOIN ""Tag"" t__Parent ON t__Parent.""Id"" = t.""Parent_id""
WHERE (t.""Parent_id"" = a__Parent.""Id"") AND (t__Parent.""Id"" = 10)
limit 0,1))", t12);
var t13 = fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a.""Ddd"", a.""Name""
FROM ""Tag"" a
WHERE (exists(SELECT 1
FROM ""Tag"" t
LEFT JOIN ""Tag"" t__Parent ON t__Parent.""Id"" = t.""Parent_id""
WHERE (t.""Parent_id"" = a.""Id"") AND (t__Parent.""Id"" = 10)
limit 0,1))", t13);
var t14 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Any()).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
WHERE (exists(SELECT 1
FROM ""Tag"" t
LEFT JOIN ""Tag"" t__Parent ON t__Parent.""Id"" = t.""Parent_id""
WHERE (t.""Parent_id"" = a__Parent.""Id"") AND (t__Parent.""Id"" = 10)
limit 0,1))", t14);
var t15 = fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).ToSql();
fsql.Select<Tag>().Where(a => a.Parent.Tags.Where(t => t.Parent.Id == 10).Select(t => t.Name).ToList().Contains(a.Name)).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
WHERE (((a.""Name"") in (SELECT t.""Name"" as1
FROM ""Tag"" t
LEFT JOIN ""Tag"" t__Parent ON t__Parent.""Id"" = t.""Parent_id""
WHERE (t.""Parent_id"" = a__Parent.""Id"") AND (t__Parent.""Id"" = 10))))", t15);
//ManyToMany
var t2 = g.sqlite.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
//SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
//FROM `Song` a
//WHERE(exists(SELECT 1
// FROM `Song_tag` Mt_Ms
// WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
// FROM `Tag` t
// WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
// limit 0, 1))
// limit 0, 1))
var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""Id"", a.""Create_time"", a.""Is_deleted"", a.""Title"", a.""Url""
FROM ""Song"" a
WHERE (exists(SELECT 1
FROM ""Song_tag"" Mt_Ms
WHERE (Mt_Ms.""Song_id"" = a.""Id"") AND (exists(SELECT 1
FROM ""Tag"" t
WHERE (t.""Name"" = '国语') AND (t.""Id"" = Mt_Ms.""Tag_id"")
limit 0,1))
limit 0,1))", t2);
var t21 = fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Any(t => t.Name == "国语")).First();
Assert.Equal(@"SELECT a.""Id"", a.""Create_time"", a.""Is_deleted"", a.""Title"", a.""Url""
FROM ""Song"" a
WHERE (exists(SELECT 1
FROM ""Tag"" t
WHERE (exists(SELECT 1
FROM ""Song_tag"" Mt_Ma
WHERE (Mt_Ma.""Tag_id"" = t.""Id"") AND (Mt_Ma.""Song_id"" = a.""Id"")
limit 0,1)) AND (t.""Name"" = '国语')
limit 0,1))", t21);
var t22 = fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).ToSql();
fsql.Select<Song>().Where(s => s.Tags.Where(t => t.Name == "国语").Any()).First();
Assert.Equal(@"SELECT a.""Id"", a.""Create_time"", a.""Is_deleted"", a.""Title"", a.""Url""
FROM ""Song"" a
WHERE (exists(SELECT 1
FROM ""Tag"" t
WHERE (exists(SELECT 1
FROM ""Song_tag"" Mt_Ma
WHERE (Mt_Ma.""Tag_id"" = t.""Id"") AND (Mt_Ma.""Song_id"" = a.""Id"")
limit 0,1)) AND (t.""Name"" = '国语')
limit 0,1))", t22);
var t23 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Any(s => s.Title == "中国人")).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
WHERE (exists(SELECT 1
FROM ""Song"" s
WHERE (exists(SELECT 1
FROM ""Song_tag"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""Song_id"" = s.""Id"") AND (Ms_Ma__Parent.""Tag_id"" = a__Parent.""Id"")
limit 0,1)) AND (s.""Title"" = '中国人')
limit 0,1))", t23);
var t24 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Any()).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
WHERE (exists(SELECT 1
FROM ""Song"" s
WHERE (exists(SELECT 1
FROM ""Song_tag"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""Song_id"" = s.""Id"") AND (Ms_Ma__Parent.""Tag_id"" = a__Parent.""Id"")
limit 0,1)) AND (s.""Title"" = '中国人')
limit 0,1))", t24);
var t25 = fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).ToSql();
fsql.Select<Tag>().Where(t => t.Parent.Songs.Where(s => s.Title == "中国人").Select(s => s.Title).ToList().Contains(t.Name)).First();
Assert.Equal(@"SELECT a.""Id"", a.""Parent_id"", a__Parent.""Id"" as3, a__Parent.""Parent_id"" as4, a__Parent.""Ddd"", a__Parent.""Name"", a.""Ddd"" as7, a.""Name"" as8
FROM ""Tag"" a
LEFT JOIN ""Tag"" a__Parent ON a__Parent.""Id"" = a.""Parent_id""
WHERE (((a.""Name"") in (SELECT s.""Title"" as1
FROM ""Song"" s
WHERE (exists(SELECT 1
FROM ""Song_tag"" Ms_Ma__Parent
WHERE (Ms_Ma__Parent.""Song_id"" = s.""Id"") AND (Ms_Ma__Parent.""Tag_id"" = a__Parent.""Id"")
limit 0,1)) AND (s.""Title"" = '中国人'))))", t25);
var t3 = g.sqlite.Select<Song>().ToList(r => new
var t3 = fsql.Select<Song>().ToList(r => new
{
r.Title,
c2 = r.Tags.Count,
c3 = r.Tags.Count(),
c4 = r.Tags.Count(tag => tag.Id > 0),
s1 = r.Tags.Sum(b => b.Id + 0),
a1 = r.Tags.Average(b => b.Id + 1),
m1 = r.Tags.Max(b => b.Id + 2),
m2 = r.Tags.Min(b => b.Id + 3),
f1 = r.Tags.Select(b => b.Name).First(),
count = r.Tags.AsSelect().Count(),
//sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
//avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
//max = r.Tags.AsSelect().Max(b => b.Id + 2),
//min = r.Tags.AsSelect().Min(b => b.Id + 3),
//first = r.Tags.AsSelect().First(b => b.Name)
sum = r.Tags.AsSelect().Sum(b => b.Id + 0),
avg = r.Tags.AsSelect().Avg(b => b.Id + 1),
max = r.Tags.AsSelect().Max(b => b.Id + 2),
min = r.Tags.AsSelect().Min(b => b.Id + 3),
first = r.Tags.AsSelect().First(b => b.Name)
});
}