c#create method接受lambda作为字段名称列表

时间:2016-11-16 09:53:26

标签: c# linq generics nhibernate lambda

我想创建一个可以以这种方式与lambda一起使用的方法:

return Method<MyClass>(x => x.PropName1, x.PropName2,...);

在其中我必须使用tha propName通过nhibernate急切加载这些引用字段:

return session.Query<MyClass>()
    .Fetch(c => c.PropName1)
    .Fetch(c => c.PropName2).ToList();

我查看linq源代码以找到类似的内容并转到此处:

public static void ListEager<TEntity>(IEnumerable<Func<TEntity, TKey>> fields)

但这根本不正确。

怎么做?

2 个答案:

答案 0 :(得分:1)

您可以这样做,使用通用方法IGeneric实现Generic接口和GetList类,我使用这种通用方法并且运行良好。

public interface IGenericDataRepository<T> where T : class
{

    IList<T> GetList(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties);

}
public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class
{
    public virtual IList<T> GetList(Func<T, bool> where,
      params Expression<Func<T, object>>[] navigationProperties)
    {
        List<T> list;
        using (var dbQuery = new session.Query<T>())
        {


            //Apply eager loading
            foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                dbQuery = dbQuery.Fetch<T, object>(navigationProperty);

            list = dbQuery
                .AsNoTracking()
                .Where(where)
                .ToList<T>();
        }
        return list;
    }
}

要使用它,您需要为任何实体创建存储库类,这是我的ProductRepository类的示例

  public interface IProductRepository:IGenericDataRepository<Product>
    {
           ////
    }
  public class     ProductRepository:GenericDataRepository<Product>,IProductRepository
    {
             ////
    }

答案 1 :(得分:0)

我切换到查询以获得更多权力:D

public IEnumerable<TEntity> List(params Expression<Func<TEntity, object>>[] eagerFields)
    {
        var query = _session.QueryOver<TEntity>();
        query = AddReferenceFetch(query, eagerFields);
        return query.TransformUsing(Transformers.DistinctRootEntity).List();
    }

private IQueryOver<TEntity, TEntity> AddReferenceFetch(IQueryOver<TEntity, TEntity> query, params Expression<Func<TEntity, object>>[] eagerFields)
        {
            foreach (Expression<Func<TEntity, object>> field in eagerFields)
                query = query.Fetch(field).Eager;

            return query;
        }

通过这种方式,我可以管理参考或者没有问题的任务

我把@mww留给了接受的答案,因为主要的想法是他的

相关问题