|
1 | 1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | 2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | 3 |
|
| 4 | +using Microsoft.Data.SqlClient; |
| 5 | +using Microsoft.EntityFrameworkCore.TestModels.JsonQuery; |
| 6 | + |
4 | 7 | namespace Microsoft.EntityFrameworkCore.Query; |
5 | 8 |
|
6 | 9 | public class JsonQuerySqlServerTest : JsonQueryTestBase<JsonQuerySqlServerFixture> |
@@ -838,6 +841,183 @@ FROM [JsonEntitiesAllTypes] AS [j] |
838 | 841 | """); |
839 | 842 | } |
840 | 843 |
|
| 844 | + [ConditionalTheory] |
| 845 | + [MemberData(nameof(IsAsyncData))] |
| 846 | + public virtual async Task FromSql_on_entity_with_json_basic(bool async) |
| 847 | + { |
| 848 | + await AssertQuery( |
| 849 | + async, |
| 850 | + ss => ((DbSet<JsonEntityBasic>)ss.Set<JsonEntityBasic>()).FromSqlRaw( |
| 851 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesBasic] AS j")), |
| 852 | + ss => ss.Set<JsonEntityBasic>(), |
| 853 | + entryCount: 40); |
| 854 | + |
| 855 | + AssertSql( |
| 856 | +""" |
| 857 | +SELECT [m].[Id], [m].[EntityBasicId], [m].[Name], JSON_QUERY([m].[OwnedCollectionRoot],'$'), JSON_QUERY([m].[OwnedReferenceRoot],'$') |
| 858 | +FROM ( |
| 859 | + SELECT * FROM "JsonEntitiesBasic" AS j |
| 860 | +) AS [m] |
| 861 | +"""); |
| 862 | + } |
| 863 | + |
| 864 | + [ConditionalTheory] |
| 865 | + [MemberData(nameof(IsAsyncData))] |
| 866 | + public virtual async Task FromSqlInterpolated_on_entity_with_json_with_predicate(bool async) |
| 867 | + { |
| 868 | + var parameter = new SqlParameter { ParameterName = "prm", Value = 1 }; |
| 869 | + await AssertQuery( |
| 870 | + async, |
| 871 | + ss => ((DbSet<JsonEntityBasic>)ss.Set<JsonEntityBasic>()).FromSql( |
| 872 | + Fixture.TestStore.NormalizeDelimitersInInterpolatedString($"SELECT * FROM [JsonEntitiesBasic] AS j WHERE [j].[Id] = {parameter}")), |
| 873 | + ss => ss.Set<JsonEntityBasic>(), |
| 874 | + entryCount: 40); |
| 875 | + |
| 876 | + AssertSql( |
| 877 | +""" |
| 878 | +prm='1' |
| 879 | +
|
| 880 | +SELECT [m].[Id], [m].[EntityBasicId], [m].[Name], JSON_QUERY([m].[OwnedCollectionRoot],'$'), JSON_QUERY([m].[OwnedReferenceRoot],'$') |
| 881 | +FROM ( |
| 882 | + SELECT * FROM "JsonEntitiesBasic" AS j WHERE "j"."Id" = @prm |
| 883 | +) AS [m] |
| 884 | +"""); |
| 885 | + } |
| 886 | + |
| 887 | + [ConditionalTheory] |
| 888 | + [MemberData(nameof(IsAsyncData))] |
| 889 | + public virtual async Task FromSql_on_entity_with_json_project_json_reference(bool async) |
| 890 | + { |
| 891 | + await AssertQuery( |
| 892 | + async, |
| 893 | + ss => ((DbSet<JsonEntityBasic>)ss.Set<JsonEntityBasic>()).FromSqlRaw( |
| 894 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesBasic] AS j")) |
| 895 | + .AsNoTracking() |
| 896 | + .Select(x => x.OwnedReferenceRoot.OwnedReferenceBranch), |
| 897 | + ss => ss.Set<JsonEntityBasic>().Select(x => x.OwnedReferenceRoot.OwnedReferenceBranch)); |
| 898 | + |
| 899 | + AssertSql( |
| 900 | +""" |
| 901 | +SELECT JSON_QUERY([m].[OwnedReferenceRoot],'$.OwnedReferenceBranch'), [m].[Id] |
| 902 | +FROM ( |
| 903 | + SELECT * FROM "JsonEntitiesBasic" AS j |
| 904 | +) AS [m] |
| 905 | +"""); |
| 906 | + } |
| 907 | + |
| 908 | + [ConditionalTheory] |
| 909 | + [MemberData(nameof(IsAsyncData))] |
| 910 | + public virtual async Task FromSql_on_entity_with_json_project_json_collection(bool async) |
| 911 | + { |
| 912 | + await AssertQuery( |
| 913 | + async, |
| 914 | + ss => ((DbSet<JsonEntityBasic>)ss.Set<JsonEntityBasic>()).FromSqlRaw( |
| 915 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesBasic] AS j")) |
| 916 | + .AsNoTracking() |
| 917 | + .Select(x => x.OwnedReferenceRoot.OwnedCollectionBranch), |
| 918 | + ss => ss.Set<JsonEntityBasic>().Select(x => x.OwnedReferenceRoot.OwnedCollectionBranch), |
| 919 | + elementAsserter: (e, a) => AssertCollection(e, a, elementSorter: ee => (ee.Date, ee.Enum, ee.Fraction))); |
| 920 | + |
| 921 | + AssertSql( |
| 922 | +""" |
| 923 | +SELECT JSON_QUERY([m].[OwnedReferenceRoot],'$.OwnedCollectionBranch'), [m].[Id] |
| 924 | +FROM ( |
| 925 | + SELECT * FROM "JsonEntitiesBasic" AS j |
| 926 | +) AS [m] |
| 927 | +"""); |
| 928 | + } |
| 929 | + |
| 930 | + [ConditionalTheory] |
| 931 | + [MemberData(nameof(IsAsyncData))] |
| 932 | + public virtual async Task FromSql_on_entity_with_json_inheritance_on_base(bool async) |
| 933 | + { |
| 934 | + await AssertQuery( |
| 935 | + async, |
| 936 | + ss => ((DbSet<JsonEntityInheritanceBase>)ss.Set<JsonEntityInheritanceBase>()).FromSqlRaw( |
| 937 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesInheritance] AS j")), |
| 938 | + ss => ss.Set<JsonEntityInheritanceBase>(), |
| 939 | + entryCount: 38); |
| 940 | + |
| 941 | + AssertSql( |
| 942 | +""" |
| 943 | +SELECT [m].[Id], [m].[Discriminator], [m].[Name], [m].[Fraction], JSON_QUERY([m].[CollectionOnBase],'$'), JSON_QUERY([m].[ReferenceOnBase],'$'), JSON_QUERY([m].[CollectionOnDerived],'$'), JSON_QUERY([m].[ReferenceOnDerived],'$') |
| 944 | +FROM ( |
| 945 | + SELECT * FROM "JsonEntitiesInheritance" AS j |
| 946 | +) AS [m] |
| 947 | +"""); |
| 948 | + } |
| 949 | + |
| 950 | + [ConditionalTheory] |
| 951 | + [MemberData(nameof(IsAsyncData))] |
| 952 | + public virtual async Task FromSql_on_entity_with_json_inheritance_on_derived(bool async) |
| 953 | + { |
| 954 | + await AssertQuery( |
| 955 | + async, |
| 956 | + ss => ((DbSet<JsonEntityInheritanceDerived>)ss.Set<JsonEntityInheritanceDerived>()).FromSqlRaw( |
| 957 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesInheritance] AS j")), |
| 958 | + ss => ss.Set<JsonEntityInheritanceDerived>(), |
| 959 | + entryCount: 25); |
| 960 | + |
| 961 | + AssertSql( |
| 962 | +""" |
| 963 | +SELECT [m].[Id], [m].[Discriminator], [m].[Name], [m].[Fraction], JSON_QUERY([m].[CollectionOnBase],'$'), JSON_QUERY([m].[ReferenceOnBase],'$'), JSON_QUERY([m].[CollectionOnDerived],'$'), JSON_QUERY([m].[ReferenceOnDerived],'$') |
| 964 | +FROM ( |
| 965 | + SELECT * FROM "JsonEntitiesInheritance" AS j |
| 966 | +) AS [m] |
| 967 | +WHERE [m].[Discriminator] = N'JsonEntityInheritanceDerived' |
| 968 | +"""); |
| 969 | + } |
| 970 | + |
| 971 | + [ConditionalTheory] |
| 972 | + [MemberData(nameof(IsAsyncData))] |
| 973 | + public virtual async Task FromSql_on_entity_with_json_inheritance_project_reference_on_base(bool async) |
| 974 | + { |
| 975 | + await AssertQuery( |
| 976 | + async, |
| 977 | + ss => ((DbSet<JsonEntityInheritanceBase>)ss.Set<JsonEntityInheritanceBase>()).FromSqlRaw( |
| 978 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesInheritance] AS j")) |
| 979 | + .AsNoTracking() |
| 980 | + .OrderBy(x => x.Id) |
| 981 | + .Select(x => x.ReferenceOnBase), |
| 982 | + ss => ss.Set<JsonEntityInheritanceBase>().OrderBy(x => x.Id).Select(x => x.ReferenceOnBase), |
| 983 | + assertOrder: true); |
| 984 | + |
| 985 | + AssertSql( |
| 986 | +""" |
| 987 | +SELECT JSON_QUERY([m].[ReferenceOnBase],'$'), [m].[Id] |
| 988 | +FROM ( |
| 989 | + SELECT * FROM "JsonEntitiesInheritance" AS j |
| 990 | +) AS [m] |
| 991 | +ORDER BY [m].[Id] |
| 992 | +"""); |
| 993 | + } |
| 994 | + |
| 995 | + [ConditionalTheory] |
| 996 | + [MemberData(nameof(IsAsyncData))] |
| 997 | + public virtual async Task FromSql_on_entity_with_json_inheritance_project_reference_on_derived(bool async) |
| 998 | + { |
| 999 | + await AssertQuery( |
| 1000 | + async, |
| 1001 | + ss => ((DbSet<JsonEntityInheritanceDerived>)ss.Set<JsonEntityInheritanceDerived>()).FromSqlRaw( |
| 1002 | + Fixture.TestStore.NormalizeDelimitersInRawString("SELECT * FROM [JsonEntitiesInheritance] AS j")) |
| 1003 | + .AsNoTracking() |
| 1004 | + .OrderBy(x => x.Id) |
| 1005 | + .Select(x => x.CollectionOnDerived), |
| 1006 | + ss => ss.Set<JsonEntityInheritanceDerived>().OrderBy(x => x.Id).Select(x => x.CollectionOnDerived), |
| 1007 | + elementAsserter: (e, a) => AssertCollection(e, a, elementSorter: ee => (ee.Date, ee.Enum, ee.Fraction)), |
| 1008 | + assertOrder: true); |
| 1009 | + |
| 1010 | + AssertSql( |
| 1011 | +""" |
| 1012 | +SELECT JSON_QUERY([m].[CollectionOnDerived],'$'), [m].[Id] |
| 1013 | +FROM ( |
| 1014 | + SELECT * FROM "JsonEntitiesInheritance" AS j |
| 1015 | +) AS [m] |
| 1016 | +WHERE [m].[Discriminator] = N'JsonEntityInheritanceDerived' |
| 1017 | +ORDER BY [m].[Id] |
| 1018 | +"""); |
| 1019 | + } |
| 1020 | + |
841 | 1021 | private void AssertSql(params string[] expected) |
842 | 1022 | => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); |
843 | 1023 | } |
0 commit comments