为IQueryable创建Exclude()扩展方法

时间:2018-03-01 08:37:11

标签: c# entity-framework linq linq-to-sql linq-to-entities

我在我的项目中使用Entity Framework。在某些情况下,我需要从行中获取所有列,有些情况下我需要获取除特定列之外的所有列,以便优化速度并避免查询大量数据。

例如,假设我在表中保存电子邮件,我有列:"从","到","主题",&# 34;内容&#34 ;.有时我只需要:

context.Emails.ToList();

有时我需要排除内容,因为它很大而且我不需要它:

context.Emails.Select(e=>new Email {
                         From=e.From,
                         To=e.To,
                         Subject=e.Subject,
                    }).ToList();

我知道我可以使用它。选择解决方案,但每次映射所有对象都有点烦人。我也知道我可以将数据分成2个表创建1:1关系,但我不喜欢这个解决方案。 无论如何,我想创建一个这样的解决方案:

context.Emails.Exclude(e=>e.Content).ToList();

基本上我在考虑做这样的扩展方法:

public static class IQueryableExtensions
    {
        public static IQueryable<TSource> Exclude<TSource, TExclude>(this IQueryable<TSource> source, Expression<Func<TSource, TExclude>> selector)
        {
            return source.Select(a =>
            {
                var obj = (TSource)Activator.CreateInstance(typeof(TSource));
                foreach (var item in typeof(TSource).GetProperties())
                {
                    if (item!=typeof(TExclude))
                    {
                         item.SetValue(obj, item.GetValue(a));
                    }                    
                 }
                return obj;
            });  
        }
    }

我认为如果我们处理IEnumerable,这可能是一个很好的解决方案,但由于我们正在处理IQueryable,这不起作用。

我基本上想要自动化IQueryable上.Select()的映射,忽略特定的属性

任何人都知道如何才能使这项工作?

0 个答案:

没有答案