Skip to content

Commit 2febaab

Browse files
author
zzzprojects
committed
Added fix GetObjectQuery
Added fix GetObjectQuery
1 parent 47c2aab commit 2febaab

File tree

10 files changed

+408
-2
lines changed

10 files changed

+408
-2
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
//#if FULL || BATCH_DELETE || BATCH_UPDATE
2+
//#if EF5 || EF6
3+
//using System;
4+
//using System.Collections.Generic;
5+
//using System.Linq;
6+
//using System.Text;
7+
//using Z.EF.Plus.BatchUpdate.Shared.Model;
8+
//using Z.EntityFramework.Plus;
9+
//using Z.EntityFramework.Plus.Internal.Core.Infrastructure;
10+
//using Z.EntityFramework.Plus.Internal.Core.Mapping;
11+
//using Z.EntityFramework.Plus.Internal.Core.SchemaObjectModel;
12+
//using Z.EF.Plus.BatchUpdate.Shared.Model;
13+
//using Z.EntityFramework.Plus;
14+
//using Z.EntityFramework.Plus.Internal.Core.Infrastructure;
15+
//using Z.EntityFramework.Plus.Internal.Core.Mapping;
16+
//using Z.EntityFramework.Plus.Internal.Core.SchemaObjectModel;
17+
18+
//namespace Z.EF.Plus._Core.Shared.Extensions
19+
//{
20+
21+
// public static class DbModelPlusExtentions
22+
// {
23+
// public static IEnumerable<TableDefinition> GetTableDefinitions<T>(this DbModelPlus model)
24+
// {
25+
// string strName = typeof(T).Name;
26+
27+
// //get our table definitions
28+
// IEnumerable<TableDefinition> lsTableDefinitions = GetTableDefinitions(model, strName);
29+
30+
// //holds our new order which everything will be presented
31+
// int intCurrentOrder = 0;
32+
33+
// //this will assist with building our new list of combined definitions
34+
// Dictionary<string, TableDefinition> dicCombinedTableDefinitions = new Dictionary<string, TableDefinition>();
35+
36+
// //loop through our table definitions and combine them
37+
// foreach (TableDefinition tdTableDefinition in lsTableDefinitions)
38+
// {
39+
// string strKey = tdTableDefinition.Schema + "-" + tdTableDefinition.Table;
40+
41+
// //index or retrieve depending if we've hit it before
42+
// if (!dicCombinedTableDefinitions.ContainsKey(strKey))
43+
// {
44+
// //change the order
45+
// tdTableDefinition.Order = intCurrentOrder;
46+
47+
// //index
48+
// dicCombinedTableDefinitions[strKey] = tdTableDefinition;
49+
50+
// //increment
51+
// intCurrentOrder++;
52+
// }
53+
// else
54+
// {
55+
// TableDefinition tdCurrent = dicCombinedTableDefinitions[strKey];
56+
57+
// //merge our keys
58+
// tdCurrent.Keys = tdCurrent
59+
// .Keys
60+
// .Union(tdTableDefinition.Keys)
61+
// .GroupBy(i => i.Name)
62+
// .Select(i => i.FirstOrDefault())
63+
// .Where(i => i != null)
64+
// .ToList();
65+
66+
// //merge our properties
67+
// tdCurrent.Properties = tdCurrent
68+
// .Properties
69+
// .Union(tdTableDefinition.Properties)
70+
// .GroupBy(i => i.Name)
71+
// .Select(i => i.FirstOrDefault())
72+
// .Where(i => i != null)
73+
// .ToList();
74+
// }
75+
// }
76+
77+
// return dicCombinedTableDefinitions.Values;
78+
// }
79+
80+
// private static IEnumerable<TableDefinition> GetTableDefinitions(DbModelPlus model, string strName)
81+
// {
82+
// //get our entity type
83+
// SchemaEntityType setEntityType = model.ConceptualModel.Index_EntityTypes_Name[strName];
84+
85+
// //create our update entity
86+
// TableDefinition ueEntity = new TableDefinition();
87+
88+
// //create our return list and add our definition
89+
// List<TableDefinition> lsTableDefinitions = new List<TableDefinition>();
90+
91+
// //if we have mapping data, leverage it
92+
// if (setEntityType.EntityTypeMapping != null)
93+
// {
94+
// lsTableDefinitions.Add(ueEntity);
95+
96+
// ueEntity.Schema = setEntityType.EntityTypeMapping.MappingFragment.StoreEntitySet.Schema;
97+
// ueEntity.Table = setEntityType.EntityTypeMapping.MappingFragment.StoreEntitySet.Table;
98+
99+
// //map our keys for this model
100+
// List<ScalarPropertyMapping> lsKeys = new List<ScalarPropertyMapping>();
101+
// foreach (PropertyRefElement propertyKey in setEntityType.EntityTypeMapping.MappingFragment.StoreEntitySet.EntityType.Key.PropertyRefs)
102+
// {
103+
// ScalarPropertyMapping mappingProperty = setEntityType.EntityTypeMapping.MappingFragment.ScalarProperties.Find(x => x.Name == propertyKey.Name);
104+
105+
// if (mappingProperty == null)
106+
// {
107+
// throw new Exception(string.Format(ExceptionMessage.BatchOperations_PropertyNotFound, propertyKey.Name));
108+
// }
109+
110+
// lsKeys.Add(mappingProperty);
111+
// }
112+
// ueEntity.Keys = lsKeys;
113+
114+
// //clone our list of properties
115+
// ueEntity.Properties = setEntityType.EntityTypeMapping.MappingFragment.ScalarProperties.ToList();
116+
117+
// //if there's no base type, stop here
118+
// if (string.IsNullOrEmpty(setEntityType.BaseType))
119+
// {
120+
// return lsTableDefinitions;
121+
// }
122+
// }
123+
124+
// //stop here if there's no base type
125+
// if (string.IsNullOrEmpty(setEntityType.BaseType))
126+
// {
127+
// return lsTableDefinitions;
128+
// }
129+
130+
// //strip the alias bit
131+
// string strBaseType = setEntityType.BaseType.Replace(model.ConceptualModel.Alias + ".", "");
132+
133+
// //get the columns for our base class
134+
// IEnumerable<TableDefinition> lsBaseTableDefinitions = GetTableDefinitions(model, strBaseType);
135+
136+
// //increment the order of the base column entities by one
137+
// foreach (TableDefinition ueBaseEntity in lsBaseTableDefinitions)
138+
// {
139+
// ueBaseEntity.Order += 1;
140+
141+
// lsTableDefinitions.Add(ueBaseEntity);
142+
// }
143+
144+
// return lsTableDefinitions;
145+
// }
146+
// }
147+
//}
148+
//}
149+
//#endif
150+
//#endif

src/shared/Z.EF.Plus.QueryFilter.Shared/QueryFilterQueryable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public QueryFilterQueryable(DbContext context, AliasQueryFilterSet filterSet, IQ
6464
public override void UpdateInternalQuery()
6565
{
6666
var query = OriginalQuery;
67-
67+
6868
foreach (var filter in Filters)
6969
{
7070
query = filter.ApplyFilter<T>(query);

src/shared/Z.EF.Plus._Core.Shared/EF5_EF6/IQueryable/IQueryable.GetObjectQuery.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,23 @@ internal static ObjectQuery GetObjectQuery(this IQueryable query)
7575
return objectQuery;
7676
}
7777

78+
79+
// Check if a InnerQuery on AutoMapper 3erd party library with field Inner.
80+
var innerField = query.GetType().GetField("inner", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase);
81+
82+
if (innerField != null)
83+
{
84+
var innerQuery = innerField.GetValue(query) as IQueryable;
85+
86+
if (innerQuery != null && query != innerQuery)
87+
{
88+
var innerObjectQuery = innerQuery.GetObjectQuery();
89+
return innerObjectQuery;
90+
}
91+
}
92+
7893
// CHECK if a InnerQuery exists
79-
var innerQueryProperty = query.GetType().GetProperty("InnerQuery", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
94+
var innerQueryProperty = query.GetType().GetProperty("InnerQuery", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase);
8095

8196
if (innerQueryProperty != null)
8297
{

src/shared/Z.EF.Plus._Core.Shared/EF5_EF6/IQueryable/IQueryable.GetObjectQuerySafe.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,34 @@ internal static ObjectQuery GetObjectQuerySafe(this IQueryable query)
7575
return objectQuery;
7676
}
7777

78+
// Check if a InnerQuery on AutoMapper 3erd party library with field Inner.
79+
var innerField = query.GetType().GetField("inner", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase);
80+
81+
if (innerField != null)
82+
{
83+
var innerQuery = innerField.GetValue(query) as IQueryable;
84+
85+
if (innerQuery != null && query != innerQuery)
86+
{
87+
var innerObjectQuery = innerQuery.GetObjectQuery();
88+
return innerObjectQuery;
89+
}
90+
}
91+
92+
// CHECK if a InnerQuery exists
93+
var innerQueryProperty = query.GetType().GetProperty("InnerQuery", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase);
94+
95+
if (innerQueryProperty != null)
96+
{
97+
var innerQuery = innerQueryProperty.GetValue(query, null) as IQueryable;
98+
99+
if (innerQuery != null && query != innerQuery)
100+
{
101+
var innerObjectQuery = innerQuery.GetObjectQuery();
102+
return innerObjectQuery;
103+
}
104+
}
105+
78106
return null;
79107
}
80108
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#if FULL || BATCH_DELETE || BATCH_UPDATE
2+
#if EF6
3+
using System.Linq;
4+
5+
namespace Z.EntityFramework.Plus
6+
{
7+
internal static partial class InternalExtensions
8+
{
9+
public static bool IsWithoutObjectContext<T>(this IQueryable<T> q)
10+
{
11+
var fullName = q.GetType().FullName;
12+
return fullName.StartsWith("System.Collections.ObjectModel.ObservableCollection");
13+
}
14+
}
15+
}
16+
17+
#endif
18+
#endif
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#if FULL || BATCH_DELETE || BATCH_UPDATE
2+
#if EF5 || EF6
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using Z.EF.Plus.BatchUpdate.Shared.Model;
7+
using Z.EntityFramework.Plus;
8+
using Z.EntityFramework.Plus.Internal.Core.Infrastructure;
9+
using Z.EntityFramework.Plus.Internal.Core.Mapping;
10+
using Z.EntityFramework.Plus.Internal.Core.SchemaObjectModel;
11+
12+
namespace Z.EF.Plus.BatchUpdate.Shared.Extensions
13+
{
14+
public static class DbModelPlusExtentions
15+
{
16+
internal static IEnumerable<TableDefinition> GetTableDefinitions<T>(this DbModelPlus model)
17+
{
18+
string strName = typeof(T).Name;
19+
20+
//get our table definitions
21+
IEnumerable<TableDefinition> lsTableDefinitions = GetTableDefinitions(model, strName);
22+
23+
//holds our new order which everything will be presented
24+
int intCurrentOrder = 0;
25+
26+
//this will assist with building our new list of combined definitions
27+
Dictionary<string, TableDefinition> dicCombinedTableDefinitions = new Dictionary<string, TableDefinition>();
28+
29+
//loop through our table definitions and combine them
30+
foreach (TableDefinition tdTableDefinition in lsTableDefinitions)
31+
{
32+
string strKey = tdTableDefinition.Schema + "-" + tdTableDefinition.Table;
33+
34+
//index or retrieve depending if we've hit it before
35+
if (!dicCombinedTableDefinitions.ContainsKey(strKey))
36+
{
37+
//change the order
38+
tdTableDefinition.Order = intCurrentOrder;
39+
40+
//index
41+
dicCombinedTableDefinitions[strKey] = tdTableDefinition;
42+
43+
//increment
44+
intCurrentOrder++;
45+
}
46+
else
47+
{
48+
TableDefinition tdCurrent = dicCombinedTableDefinitions[strKey];
49+
50+
//merge our keys
51+
tdCurrent.Keys = tdCurrent
52+
.Keys
53+
.Union(tdTableDefinition.Keys)
54+
.GroupBy(i => i.Name)
55+
.Select(i => i.FirstOrDefault())
56+
.Where(i => i != null)
57+
.ToList();
58+
59+
//merge our properties
60+
tdCurrent.Properties = tdCurrent
61+
.Properties
62+
.Union(tdTableDefinition.Properties)
63+
.GroupBy(i => i.Name)
64+
.Select(i => i.FirstOrDefault())
65+
.Where(i => i != null)
66+
.ToList();
67+
}
68+
}
69+
70+
return dicCombinedTableDefinitions.Values;
71+
}
72+
73+
private static IEnumerable<TableDefinition> GetTableDefinitions(DbModelPlus model, string strName)
74+
{
75+
//get our entity type
76+
SchemaEntityType setEntityType = model.ConceptualModel.Index_EntityTypes_Name[strName];
77+
78+
//create our update entity
79+
TableDefinition ueEntity = new TableDefinition();
80+
81+
//create our return list and add our definition
82+
List<TableDefinition> lsTableDefinitions = new List<TableDefinition>();
83+
84+
//if we have mapping data, leverage it
85+
if (setEntityType.EntityTypeMapping != null)
86+
{
87+
lsTableDefinitions.Add(ueEntity);
88+
89+
ueEntity.Schema = setEntityType.EntityTypeMapping.MappingFragment.StoreEntitySet.Schema;
90+
ueEntity.Table = setEntityType.EntityTypeMapping.MappingFragment.StoreEntitySet.Table;
91+
92+
//map our keys for this model
93+
List<ScalarPropertyMapping> lsKeys = new List<ScalarPropertyMapping>();
94+
foreach (PropertyRefElement propertyKey in setEntityType.EntityTypeMapping.MappingFragment.StoreEntitySet.EntityType.Key.PropertyRefs)
95+
{
96+
ScalarPropertyMapping mappingProperty = setEntityType.EntityTypeMapping.MappingFragment.ScalarProperties.Find(x => x.Name == propertyKey.Name);
97+
98+
if (mappingProperty == null)
99+
{
100+
throw new Exception(string.Format(ExceptionMessage.BatchOperations_PropertyNotFound, propertyKey.Name));
101+
}
102+
103+
lsKeys.Add(mappingProperty);
104+
}
105+
ueEntity.Keys = lsKeys;
106+
107+
//clone our list of properties
108+
ueEntity.Properties = setEntityType.EntityTypeMapping.MappingFragment.ScalarProperties.ToList();
109+
110+
//if there's no base type, stop here
111+
if (string.IsNullOrEmpty(setEntityType.BaseType))
112+
{
113+
return lsTableDefinitions;
114+
}
115+
}
116+
117+
//stop here if there's no base type
118+
if (string.IsNullOrEmpty(setEntityType.BaseType))
119+
{
120+
return lsTableDefinitions;
121+
}
122+
123+
//strip the alias bit
124+
string strBaseType = setEntityType.BaseType.Replace(model.ConceptualModel.Alias + ".", "");
125+
126+
//get the columns for our base class
127+
IEnumerable<TableDefinition> lsBaseTableDefinitions = GetTableDefinitions(model, strBaseType);
128+
129+
//increment the order of the base column entities by one
130+
foreach (TableDefinition ueBaseEntity in lsBaseTableDefinitions)
131+
{
132+
ueBaseEntity.Order += 1;
133+
134+
lsTableDefinitions.Add(ueBaseEntity);
135+
}
136+
137+
return lsTableDefinitions;
138+
}
139+
}
140+
}
141+
#endif
142+
#endif

0 commit comments

Comments
 (0)