NHibernate Linq Select投影-检索完整的实体与部分选择

本文关键字:实体 选择 Select Linq 投影 检索 NHibernate | 更新日期: 2023-09-27 18:13:45

我在局部投影方面遇到了一点小问题。

我有一个方法在我们的列表框,所以我们可以很容易地加载实体到他们,但是加载完整的实体当然不是一个选项。这意味着我必须做一些投影,我在这里做了这个,你可以选择哪个属性作为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选择器来标识实体,并且我不想改变调用方法的方式。

有办法解决这个问题吗?

NHibernate Linq Select投影-检索完整的实体与部分选择

执行部分选择的一种方法是将选择器表达式更改为类型:

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);
    }
}