Ef(EntityFramework) select 操作后Map到實體類型的方法


使用Ef 一直以來都有一個問題困擾着我,就是select 操作后在View頁面 Render的時候非常麻煩,今日終於不勝其擾,下了一個方法,供大家參考。

controller :

 

1             var articleEntity = articleRepo.List().Where(x => x.AreaList.Select(s => s.Name).Contains("首頁")).Select(x => new
2             {
3                 Title = x.Title,
4                 AreaList = x.AreaList,
5                 CoverPic = x.CoverPic
6             }).ToList().Map<List<Article>>();

 

Map方法:

 1  public static T Map<T>(this object obj)
 2             where T : class, new()
 3         {
 4             var objType = obj.GetType();
 5 
 6             if (objType.GetInterface("IList") == null)
 7             {
 8                 T t = new T();
 9 
10                 var srcType = t.GetType();
11 
12                 var srcTypeProps = srcType.GetProperties();
13 
14                 foreach (var property in objType.GetProperties())
15                 {
16                     var srcTypeProp = srcTypeProps.FirstOrDefault(x => x.Name == property.Name);
17 
18                     if (srcTypeProp != null)
19                     {
20                         srcTypeProp.SetValue(t, property.GetValue(obj));
21                     }
22                 }
23 
24                 return t;
25             }
26             else
27             {
28                 //obj 包含IList 接口則 T必須包含 
29                 try
30                 {
31                     var srcType = typeof(T);
32 
33                     if (srcType.GetInterface("IList") == null)
34                     {
35                         throw new Exception("數據值與目標值包含的結構不一致");
36                     }
37 
38                     var t = new T() as IList;
39 
40                     var objArgumentType = objType.GenericTypeArguments[0];
41 
42                     var objArgumentTypeProps = objArgumentType.GetProperties();
43 
44                     //獲取泛型類型
45                     var srcTargetType = srcType.GenericTypeArguments[0];
46 
47                     var srcTargetTypeProps = srcTargetType.GetProperties();
48 
49                     foreach (var objItem in obj as IList)
50                     {
51                         var srcTargetTypeInstance = Activator.CreateInstance(srcTargetType);
52 
53                         foreach (var property in objArgumentTypeProps)
54                         {
55                             var srcProp = srcTargetTypeProps.FirstOrDefault(x => x.Name == property.Name);
56 
57                             if (srcProp != null)
58                             {
59                                 srcProp.SetValue(srcTargetTypeInstance, property.GetValue(objItem));
60                             }
61 
62                             //if (srcTargetTypeProps.Select(x => x.Name).Contains(property.Name))
63                             //{注意:這里因為用的objProp 給 srcTargetInstance 賦值,因為兩者屬於不同的類型,所以不可進行此操作.遂使用上方的方法,由srcProp給srcTargetInstance賦值
64                             //    property.SetValue(srcTargetTypeInstance, property.GetValue(objItem));
65                             //}
66                         }
67 
68                         //第二種方式
69                         //foreach (var property in srcTargetTypeProps)
70                         //{
71                         //    var objProperty = objArgumentTypeProps.FirstOrDefault(x => x.Name == property.Name);
72 
73                         //    if (objProperty != null)
74                         //    {
75                         //        property.SetValue(srcTargetTypeInstance, objProperty.GetValue(objItem));
76                         //    }
77                         //}
78 
79                         t.Add(srcTargetTypeInstance);
80                     }
81 
82                     return t as T;
83                 }
84                 catch (Exception exc)
85                 {
86                     throw;
87                 }
88             }
89         }

 

僅對IList接口做了處理,有需要的朋友可以繼續擴展其他接口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM