【问题标题】:How to skip EF Take when input parameter is null?输入参数为空时如何跳过 EF Take?
【发布时间】:2020-07-24 09:10:51
【问题描述】:

我有使用.Take() 方法的EF 查询。我从输入参数中获取多少条记录。但是如果这个参数是NULL,我根本不想调用Take。目前,如果参数是NULL,我将其设置为int.MaxValue。我应该在IQueryable<> 块上划分我的代码并检查此参数还是存在“单行”解决方案?

var itemsPerPage = int.MaxValue;
      
if (input.ItemsPerPage.HasValue &&  input.ItemsPerPage.Value > 0)
{
    itemsPerPage = input.ItemsPerPage.Value;
}

var result = await query.Take(itemsPerPage).ToListAsync();

【问题讨论】:

  • query.Take(input.ItemsPerPage ?? int.MaxValue) 将是 oneliner 解决方案,但我认为它不是有效的。或者你可以试试这样的var result = await (input.ItemsPerPage == null ? query : qurey.Take(itemsPerPage))ToListAsync();
  • var bob = query; if (condition) bob = bob.Take(itemsPerPage);

标签: c# .net entity-framework linq entity-framework-6


【解决方案1】:

标准方法是进行if 检查并在必要时更改查询本身。

IQueryable<SomeEntity> query = ...

if (input.ItemsPerPage.GetValueOrDefault() > 0)
{
    query = query.Take(input.ItemsPerPage.Value);
}

// other if operators here

var result = await query.ToListAsync();

【讨论】:

    【解决方案2】:

    如果ItemsPerPage 为空,我个人会完全删除.Take() 调用。

    ResultType result;
    if (input.ItemsPerPage.HasValue &&  input.ItemsPerPage.Value > 0)
    {
      result = await query.Take(input.ItemsPerPage.Value).ToListAsync();
    }
    else
    {
      result = await query.ToListAsync();
    }
    

    如果你有这种倾向,你可以“单行”这个:

    var result = input.ItemsPerPage.HasValue &&  input.ItemsPerPage.Value > 0
      ? await query.Take(input.ItemsPerPage.Value).ToListAsync()
      : await query.ToListAsync();
    

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 2023-01-13
      • 2023-03-17
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多