实体框架执行顺序

时间:2013-06-14 07:09:07

标签: c# entity-framework

是否可以告诉我是否在调用CreateObjectSet的行上是否返回整个表然后执行Where表达式(在内存中)或者是生成的SQL中包含的where表达式?

public virtual T GetById(int Id)
        {
            if (Id != 0)
            {

            PropertyInfo PrimaryKey = GetPrimaryKey();
            var ItemParameter = Expression.Parameter(typeof(T), "item");
            var WhereExpression = Expression.Lambda<Func<T, bool>>
                (Expression.Equal(
                    Expression.Property(
                        ItemParameter,
                        PrimaryKey.Name
                    ),
                    Expression.Constant(Id)
                ),
                new[] { ItemParameter }
                );


            T Entity = GetObjectContext().CreateObjectSet<T>().Where(WhereExpression).SingleOrDefault<T>();
            GetObjectContext().Refresh(RefreshMode.StoreWins, Entity);

            return Entity;
        }
        else
        {
            return null;
        }
    }

1 个答案:

答案 0 :(得分:0)

CreateObjectSet<T>()返回ObjectSet<T>类型的实例,此类实现IQueryable<T>。调用IQueryable的方法将被转换为SQL。

您正在呼叫IQueryable<T>.Where(Expression<Func<T, bool>> predicate)

因此条件将应用于您的数据库,并且最多只会获取两行,而不是整个表。