Skip to content

Commit c7ae880

Browse files
feat(literal-lists)including literal types for non-navigation/simple members.
AutoMapper#196
1 parent 675de06 commit c7ae880

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

AutoMapper.AspNetCore.OData.EFCore/QueryableExtensions.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ private static IQueryable<TModel> GetQueryable<TModel, TData>(this IQueryable<TD
132132
{
133133

134134
var expansions = options.SelectExpand.GetExpansions(typeof(TModel));
135+
136+
var selects = options.SelectExpand.GetSelects();
137+
var literalLists = typeof(TModel).GetLiteralLists();
138+
var includes = selects.Union(literalLists).ToList();
135139

136140
return query.GetQuery
137141
(
@@ -140,7 +144,7 @@ private static IQueryable<TModel> GetQueryable<TModel, TData>(this IQueryable<TD
140144
options.GetQueryableExpression(querySettings?.ODataSettings),
141145
expansions
142146
.Select(list => new List<Expansion>(list))
143-
.BuildIncludes<TModel>(options.SelectExpand.GetSelects())
147+
.BuildIncludes<TModel>(includes)
144148
.ToList(),
145149
querySettings?.ProjectionSettings
146150
).UpdateQueryableExpression(expansions, options.Context);

AutoMapper.AspNetCore.OData.EFCore/TypeExtensions.cs

+24-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
using LogicBuilder.Expressions.Utils;
22
using Microsoft.AspNetCore.OData.Edm;
3-
using Microsoft.AspNetCore.OData.Query;
43
using Microsoft.OData.Edm;
54
using Microsoft.OData.ModelBuilder;
65
using System;
76
using System.Collections.Generic;
8-
using System.ComponentModel.DataAnnotations;
9-
using System.Diagnostics;
107
using System.Linq;
118
using System.Reflection;
129

@@ -21,6 +18,17 @@ public static MemberInfo[] GetSelectedMembers(this Type parentType, List<string>
2118

2219
return selects.Select(select => parentType.GetMemberInfo(select)).ToArray();
2320
}
21+
22+
public static IEnumerable<string> GetLiteralLists(this Type type)
23+
{
24+
foreach (var member in type.GetMemberInfos())
25+
{
26+
if (member.MemberType is not (MemberTypes.Field or MemberTypes.Property)) continue;
27+
28+
if (member.GetMemberType().IsListLiteral())
29+
yield return member.Name;
30+
}
31+
}
2432

2533
private static MemberInfo[] GetValueTypeMembers(this Type parentType)
2634
{
@@ -33,6 +41,19 @@ private static MemberInfo[] GetValueTypeMembers(this Type parentType)
3341
&& info.GetMemberType().IsLiteralType()
3442
).ToArray();
3543
}
44+
45+
private static bool IsListLiteral(this Type type)
46+
{
47+
// Check if type is a List
48+
if (!type.IsList()) return false;
49+
50+
// If not generic, check if it's a literal type (i.e. string[])
51+
if (!type.IsGenericType) return type.GetElementType().IsLiteralType();
52+
53+
// Extract the type T from List<T> and check if it's a literal type
54+
var firstGenericArgument = type.GetGenericArguments().First();
55+
return firstGenericArgument.IsLiteralType();
56+
}
3657

3758
private static MemberInfo[] GetMemberInfos(this Type parentType)
3859
=> parentType.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase);

0 commit comments

Comments
 (0)