我在我的项目中使用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()的映射,忽略特定的属性
任何人都知道如何才能使这项工作?