转换Linq表达式以使用CompiledQuery

时间:2013-01-15 20:44:46

标签: linq

我试图弄清楚如何将Linq表达式转换为CompiledQuery 这是我想要转换的现有方法

public IList<Item> GetAllItems()
{
    using (var pos = new ABCEntities())
    {
        var qryAllItems = from itm in pos.Items.Where(o=>o.Is_Inactive==false)
            select itm;

        return qryAllItems.ToList();
    }
}

1 个答案:

答案 0 :(得分:0)

我假设这是实体框架,因为您的上下文类称为ABC 实体

创建一个私有静态字段来保存已编译的查询委托,然后使用CompiledQuery.Compile()方法对其进行初始化(为了简洁,我选择在字段初始化程序中执行此操作...它可以在静态中完成构造函数,或者在第一次调用时懒惰等)。然后在调用GetAllItems()时调用委托。

private static Func<ABCEntities, IQueryable<Item>> _activeItemsQuery = 
    CompiledQuery.Compile<ABCEntities, IQueryable<Item>>(
        (pos) => pos.Items.Where(o=>o.Is_Inactive==false));

public IList<Item> GetAllItems()
{
    using (var pos = new ABCEntities())
    {
        return _activeItemsQuery(pos).ToList();
    }
}

有关EF Compiled Queries的更多信息,请访问:http://msdn.microsoft.com/en-us/library/bb896297.aspx

我还删除了您的fromselect,因为在使用该扩展方法语法时不需要它们。我可以交替完成:

private static Func<ABCEntities, IQueryable<Item>> _activeItemsQuery = 
    CompiledQuery.Compile<ABCEntities, IQueryable<Item>>(
        (pos) => from itm in pos.Items where itm.Is_Inactive == false select itm;

但我个人更喜欢大多数时候使用扩展方法。