Entity framework 调用链中的哪个位置应该包含()EF LINQ扩展名?

Entity framework 调用链中的哪个位置应该包含()EF LINQ扩展名?,entity-framework,linq-to-entities,Entity Framework,Linq To Entities,我很好奇,在使用实体框架时,调用链中应该包括哪些内容。 考虑以下方法: // sample usage from service layer // _customerRepository.Paginate(1, out totalRecords, 25, "DateJoined DESC, AmountSpent", "DateJoined >= '2009-02-01'", "Invoices, Refunds"); public virtual IQueryable<T>

我很好奇,在使用实体框架时,调用链中应该包括哪些内容。 考虑以下方法:

// sample usage from service layer
// _customerRepository.Paginate(1, out totalRecords, 25, "DateJoined DESC, AmountSpent", "DateJoined >= '2009-02-01'", "Invoices, Refunds");
public virtual IQueryable<T> Paginate(int page, out int total, int pageSize, string sort = "Id", string filter = null, string includes = null)
{
    IQueryable<T> query = DatabaseSet;

    total = query.Count(); // get total # of records (required for pagination)...
    var skipTo = GetValidSkipCount(page, total, pageSize);

    if (!String.IsNullOrWhiteSpace(filter))
    {
        query.Where(filter);
    }
    // should includes be before filtering? 
    // should query.Count() be called after query.Include? 
    // does it matter?
    if (!String.IsNullOrWhiteSpace(includes))
    {
        query.IncludeMany(includes); // my own extension that takes comma separated string of entities to include
    }

    return query.OrderBy(sort).Skip(skipTo).Take(pageSize);
}
//来自服务层的示例用法
//_customerRepository.Paginate(1,out totalRecords,25,“DateJoined DESC,amountspend”,“DateJoined>='2009-02-01'”,“发票,退款”);
公共虚拟IQueryable分页(int-page,out-int-total,int-pageSize,string-sort=“Id”,string-filter=null,string-includes=null)
{
IQueryable query=数据库集;
total=query.Count();//获取记录总数(分页需要)。。。
var skipTo=GetValidSkipCount(页面、总计、页面大小);
如果(!String.IsNullOrWhiteSpace(筛选器))
{
查询.Where(过滤器);
}
//在筛选之前是否应该包含?
//query.Count()应该在query.Include之后调用吗?
//这有关系吗?
如果(!String.IsNullOrWhiteSpace(包括))
{
query.IncludeMany(includes);//我自己的扩展,它采用逗号分隔的实体字符串来包含
}
返回query.OrderBy(sort).Skip(skipTo).Take(pageSize);
}
我的问题是:

  • 在呼叫链中是否应始终包括第一名
  • Count()是否受到Include的影响?如果是这样的话,我想我应该在包含之后再数数
  • 应包括在过滤之前或之后(何处)
  • 这真的很重要吗?因为EF足够“聪明”来解决所有问题
  • 在呼叫链中是否应始终包括第一名

    Include
    不一定是链中的第一个
    Include
    是一个非常特殊的运算符,它不是查询的一部分。这就像是查询的扩展。它也不是LINQ运算符-它是在
    ObjectQuery
    上定义的EF运算符(
    IQueryable
    扩展和
    DbQuery
    版本都在内部实现)。
    T
    定义了查询的形状和
    Include
    的根<仅当查询的结果形状与
    Include
    调用中使用的根匹配时,才使用code>Include。因此,如果您添加
    Include
    以调用
    IQueryable
    ,并且您的查询返回
    IQueryable
    ,您的
    Include
    将被应用,但是如果您的查询返回匿名类型的
    IQueryable
    ,则您更改了查询的形状,而
    Include
    将不被应用

    Count()是否受到Include的影响?如果是这样的话,我想我应该在包含之后再数数

    如果对查询执行
    Count
    ,则不使用
    Include
    <代码>计数执行查询,但不返回数据记录集-它更改了形状,并且没有任何内容可包含

    应包括在过滤之前或之后(何处)

    这不要紧。Include创建联接,我希望EF(在构建查询时)和数据库中的查询引擎(在执行查询时)在应用联接之前都应该使用筛选

    这真的很重要吗?因为EF足够“聪明”来解决所有问题


    只有当您更改查询的形状时,它才起作用-您使用投影或自定义联接。在这种情况下,以前形状的
    Include
    将丢失(根本不使用)。

    只是一个注释/问题,您在急切加载时不也使用Include吗?