【发布时间】:2015-05-04 11:51:54
【问题描述】:
我正在处理返回 IQueryable 对象的存储库。
所以,我创建了一个扩展方法来返回一个 SelectListItem 列表以用于我的视图:
public static List<SelectListItem> ToSelectList<T>(this IQueryable<T> query, Func<T, string> value, Func<T, string> text)
{
return query.Select(x => new SelectListItem() { Text = text(x), Value = value(x) }).ToList();
}
我这样称呼:
var query = Repository<MyClass>.GetAll(); //Return MyClass IQueryable
var test = query.ToSelectList(x => x.Property1, x => x.Property2);
效果很好(返回正确的列表),但是 SQL 生成的 select all property from MyClass 。我希望在 db 上只查询 Property1 和 Property2。
我错过了什么?
【问题讨论】:
-
这是使用实体框架生成到 SQL 中的吗?从生成的 SQL 中选择的其他列很可能是由于传递给您的
IQueryable<T>而不是此扩展方法中的任何内容。 -
我正在使用 NHibernate,我不知道我理解你的意思
-
您在调用此方法之前使用的 IQueryable 可能会生成选择其他列的 SQL。您的扩展方法可能没问题。
-
1.存储库不应该返回 IQueryable,它打破了它的意义,因为它返回到数据库的链接而不是数据本身。 2. 我在同一场景中使用 nHibernate,但它只选择请求的属性。可能是对 DB 的调用发生在投影到 SelectListItems 之前。
-
嗯,好的,您将 x 对象传递给方法,因此您正在请求整个对象 - ORM 会处理它并返回具有所有属性的对象。
标签: c# nhibernate extension-methods iqueryable