2016-11-16 55 views
1

我希望創建一個可與拉姆達以這種方式使用的方法:C#創建方法接受拉姆達字段名稱的列表

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) 

但它根本不正確。

怎麼辦?

+0

你想讓這個方法接受任意數量的選擇器? – Evk

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

要使用它,你需要的任何實體創建repository類,這裏是我的ProductRepository類的例子

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

的確我在我的ServiceRepository 類,我測試它的每個實體類型;)現在我會嘗試 –

+0

這不是一個問題,表達式返回「對象」,而不是實際的屬性類型? – Evk

+0

@Evk它是GetList不GetSingle它必須返回列表,糾正我,如果我錯了。 –

0

我切換到queryover以獲得更多的權力: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; 
     } 

這樣我可以管理參考或hasmany沒有問題

我離開@mww作爲接受的答案,因爲主要思想是他的