Iam在部分投影方面遇到了一些问题。
我在列表框上有一个方法,以便我们可以轻松地将实体加载到它们中,但是加载完整实体当然不是一个选项。 意思是我必须做一些投影,我在这里做了这个,你可以选择哪个属性作为DisplayValue。
使用代码如下所示:
dropCompany.LoadEntityList(Customer.Company, x => x.CompanyName, x => x.IsCompany);
部分实施如下:
public void LoadEntityList<T>(T selectedEntity,
System.Linq.Expressions.Expression<Func<T, string>> selector,
System.Linq.Expressions.Expression<Func<T,bool>> where = null)
where T : FlexyBook.Infrastructure.Entity
{
var wCollection = new ObjectWrapperCollection<object>();
IQueryable<T> query = FlexyBook.Repository.DomainService<T>.GetDomainService().GetAll();
if (where != null)
query = query.Where(where);
foreach (var item in query.Select(x =>
new ObjectWrapper<object>()
{
Value = x.ID,
Text = selector.Compile()(x)
})
.ToList().OrderBy(x => x.Text))
{
wCollection.List.Add(item);
}
}
问题是这会导致从数据库加载完整实体然后进行投影。 问题也非常明显,就是这行“selector.Compile()(x)”。
我的问题是我不知道如何允许这个部分选择作为投影继续进入NHibernate。 我显然需要ID选择器来识别实体,我不想改变方法的调用方式。
有没有解决这个问题?
答案 0 :(得分:1)
执行部分选择的一种方法是将选择器表达式更改为类型:
System.Linq.Expressions.Expression<Func<T, ObjectWrapper<object>>>
然后你会这样称呼:
dropCompany.LoadEntityList(Customer.Company, x => new ObjectWrapper<object>() { Value = x.ID, Text = x.CompanyName, x => x.IsCompany);
实施:
public void LoadEntityList<T>(T selectedEntity, System.Linq.Expressions.Expression<Func<T, ObjectWrapper<object>>> selector,System.Linq.Expressions.Expression<Func<T,bool>> where = null) where T : FlexyBook.Infrastructure.Entity
{
var wCollection = new ObjectWrapperCollection<object>();
IQueryable<T> query = FlexyBook.Repository.DomainService<T>.GetDomainService().GetAll();
if (where != null)
query = query.Where(where);
foreach (var item in query.Select(selector).ToList().OrderBy(x => x.Text))
{
wCollection.List.Add(item);
}
}