我有以下查询:
// Type T is constrained to a class that contains "ID" property
// propertiesToQuery is a list constructed based on type T
var set = AppContext.Set<T>();
var result = set.SelectMany(x => propertiesToQuery.Select(p => new { x.ID, Value = x.GetType().GetProperty(p.Name).GetValue(x) })
.Where(p => p.Value != null)
.Select(p => new SearchIndexItem
{
Key = p.Value.ToString(),
Url = Url.Action("Edit", type.Name, new { p.ID }),
Type = type
}));
现在因为 linq to entity 不允许在查询中使用 PropertyInfo,我需要在集合上运行 ToList() 以便首先在 db 上执行查询,然后执行所需的 SelectMany()。
这个查询比它需要从数据库中查询的多,当有很多数据时这将是一个问题(查询的列是字符串类型,其他可能是 blob,这些是我不想从中提取数据的)
所以问题是如何根据运行时构建的列表限制从数据库查询的列?
我试图创建一个表达式树,并将其传递给集合上的 Select() 方法,但问题在于创建匿名类型,这可能与类型 T 不同。