将变量类型传递给不枚举的方法

时间:2009-09-11 05:10:31

标签: c# linq entity-framework

我希望能够将变量类型传递给方法,主要是因为我可以将实体框架查询传递给将应用嵌套对象的常见包含的方法。

这就是我想要做的......

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

2 个答案:

答案 0 :(得分:3)

似乎你真的希望SomeType成为ObjectQuery<T>,对吧?

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

这是有效的语法。这有什么问题吗?

这应该工作并延迟执行(我认为这是你的意思是“没有枚举”),直到调用FirstOrDefault()。

答案 1 :(得分:0)

我最终创造了一种不同的方法。我的存储库现在有一个用于包含的字符串列表。为了保留创建包含的类型安全性,我创建了以下类:

/// <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的辅助方法,将应用包含,执行查询并返回结果。不是我想要的,但效果很好。