2009-09-11 2 views
0

Я хочу иметь возможность передать тип переменной методу, в основном так, что я могу передать запрос структуры сущности методу, который будет применять общие включения вложенного объекта.Передать тип переменной методу без перечисления

Это то, что я хочу сделать ...

public Person GetPersonByID(int personID) 
{ 
    var query = from Perspn p in Context.Persons 
       where p.PersonID = personID 
       select p; 

    ObjectQuery<Person> personQuery = ApplyCommonIncludes<Person>(query); 

    return personQuery.FirstOrDefault(); 
} 


public ObjectQuery<T> ApplyCommonIncludes<T>(SomeType query) 
{ 
    return ((ObjectQuery<T>)query) 
      .Include("Orders") 
      .Include("LoginHistory"); 
} 

ответ

0

В итоге я создал другой подход. В моем репозитории теперь есть список строк, используемых для Includes. Для того, чтобы сохранить безопасность типа для создания включает в себя, я создал следующий класс:

/// <summary> 
/// Builds Includes 
/// </summary> 
public class IncludeBuilder 
{ 
    /// <summary> 
    /// List of parts for the Include 
    /// </summary> 
    private List<string> Parts; 

    /// <summary> 
    /// Creates a new IncludeBuilder 
    /// </summary> 
    private IncludeBuilder() 
    { 
     this.Parts = new List<string>(); 
    } 


    /// <summary> 
    /// Creates a new IncludeBuilder 
    /// </summary> 
    public static IncludeBuilder Create() 
    { 
     return new IncludeBuilder(); 
    } 


    /// <summary> 
    /// Adds a property name to the builder 
    /// </summary> 
    public IncludeBuilder AddPart<TEntity, TProp>(Expression<Func<TEntity, TProp>> expression) 
    { 
     string propName = ExpressionHelper.GetPropertyNameFromExpression(expression); 
     this.Parts.Add(propName); 

     return this; 
    } 


    /// <summary> 
    /// Gets a value of the include parts separated by 
    /// a decimal 
    /// </summary> 
    public override string ToString() 
    { 
     return string.Join(".", this.Parts.ToArray()); 

    } 

Это позволяет мне сделать это ...

myPersonRepository.AppendInclude(
    IncludeBuilder.Create() 
      .AddPart((Person p) => p.Orders) 
      .AddPart((Order o) => o.Items)); 

Приведенное выше утверждение проходит выражений к классу IncludeBuilder, который затем транслирует выше в «Orders.Items».

Затем я создал вспомогательные методы в моем хранилище RepositoryBase, который предоставил ObjectQuery, применит включенные, выполнит запрос и вернет результат. Не совсем то, что я искал, но хорошо работает.

3

Кажется, вы на самом деле хотите SomeType быть ObjectQuery<T>, верно?

Это допустимый синтаксис. Есть ли проблемы с этим?

Это должно работать и выполнять отложенное выполнение (я думаю, это то, что вы подразумеваете под «без перечисления») до вызова FirstOrDefault().

Смежные вопросы