EF核心套装扩展选项

时间:2019-02-16 15:12:16

标签: entity-framework .net-core

如果用户未将过滤器传递给方法,则我试图防止我的方法从大表返回所有行。现在我做这样的事情

public IQueryable<Doc> grids (string filter)
{
     int all = int.MaxValue;
     if (string.IsNullOrEmpty(filter))
         all = 5;
     return rampa.Doc.Where(x => x.Napomena.Contains(filter)).Take(all);
}

有没有更好的方法来避免有条件地扩展。我不想给SQL Server负担不必要的头绪。

3 个答案:

答案 0 :(得分:1)

由于返回了IQueryable,因此可以根据条件构建查询:

import style1 from './style-1.scss';
import style2 from './style-2.css';

class LitSassLoaderTest extends LitElement {

    // TypeScript
    static styles = [
        style1,
        style2,
    ];

    // JavaScript
    static get styles() {
        return [
            style1,
            style2,
        ];
    }
}

答案 1 :(得分:0)

使用Take()的基本要求之一是必须使用OrderBy。然后,为了避免top(int.max)编写查询,如下所示:

public IQueryable<Doc> grids (string filter)
{ 
     IQueryable<Doc> query =  rampa.Doc;

     if (string.IsNullOrEmpty(filter))
     {
         query.Where(x => x.Napomena.Contains(filter)).Orderby(x => x.OrderByColumn).Take(5);
     }

     return query;
}

答案 2 :(得分:0)

从用户的角度来看,行为必须是可以理解的。他不明白为什么他只得到5条没有过滤器的记录,而得到25条进入过滤器的记录。解决该问题的一种好方法是在组合框中或通过单选按钮等为他提供选项,他可以在其中选择返回的最大记录数。 (例如10、30或100)。在用户选择.Where(filter).Take(maxRecords)的地方,您将始终拥有maxRecords

在任何情况下,无论用户是否输入过滤器,都应执行Take(max),以免发生过滤器返回的记录多于没有过滤器的情况。发生这种情况,例如,如果用户输入“ e”作为过滤器,则可能会返回很高比例的条目。

还可以使结果可重复且可理解。因此,我还建议在.Take(max)之前下订单。

带过滤器

result = source
    .Where(filter)
    .OrderBy(order)
    .Take(max);

或者,没有过滤器

result = source
    .OrderBy(order)
    .Take(max);