2017-02-22 94 views
1

我已經使用動態LINQ基於https://stackoverflow.com/a/27205784/7468628 SelectExcept。SelectExcept刪除連接表

代碼:

public static IQueryable SelectExcept<TSource, TResult>(this IQueryable<TSource> source, List<string> excludeProperties) 
    { 

     var sourceType = typeof(TSource); 
     var allowedSelectTypes = new Type[] { typeof(string), typeof(ValueType) }; 
     var sourceProperties = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => allowedSelectTypes.Any(t => t.IsAssignableFrom(((PropertyInfo)p).PropertyType))).Select(p => ((MemberInfo)p).Name); 
     var sourceFields = sourceType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => allowedSelectTypes.Any(t => t.IsAssignableFrom(((FieldInfo)f).FieldType))).Select(f => ((MemberInfo)f).Name); 

     var selectFields = sourceProperties.Concat(sourceFields).Where(p => !excludeProperties.Contains(p)).ToArray(); 

     var dynamicSelect = 
       string.Format("new({0})", 
         string.Join(", ", selectFields)); 

     return selectFields.Count() > 0 
      ? source.Select(dynamicSelect) 
      : Enumerable.Empty<TSource>().AsQueryable<TSource>(); 
    } 

這個偉大的工程與領域但此刻我的對象是一個對象,從表中,並加入了與其他表我使用SelectExcept時失去了參加價值。我怎樣才能保持這個價值呢?

回答

1

嗯,我找到了答案,所以如果有人想知道如何在這裏解決它,它是:

public static IQueryable SelectExcept<TSource, TResult>(this IQueryable<TSource> source, List<string> excludeProperties) 
    { 

     var sourceType = typeof(TSource); 
     var allowedSelectTypes = new Type[] { typeof(string), typeof(ValueType), typeof(object) }; 
     var sourceProperties = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => allowedSelectTypes.Any(t => t.IsAssignableFrom(((PropertyInfo)p).PropertyType))).Select(p => ((MemberInfo)p).Name); 
     var sourceFields = sourceType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => allowedSelectTypes.Any(t => t.IsAssignableFrom(((FieldInfo)f).FieldType))).Select(f => ((MemberInfo)f).Name); 
     var selectFields = sourceProperties.Concat(sourceFields).Where(p => !excludeProperties.Contains(p)).ToArray(); 

     var dynamicSelect = 
       string.Format("new({0})", 
         string.Join(", ", selectFields)); 

     return selectFields.Count() > 0 
      ? source.Select(dynamicSelect) 
      : Enumerable.Empty<TSource>().AsQueryable<TSource>(); 
    } 

您需要的typeof(對象)其他選擇的類型時,不會收集你自己定義的類的字段。