【问题标题】:Take all in ternary operator in LINQ?在 LINQ 中使用三元运算符?
【发布时间】:2015-10-08 07:55:03
【问题描述】:

考虑这个函数:

public List<Employees> getEmployees(....... , int? takeMax = null)
{
    // some code 
    ...

    var items = DB_Context.Employees.Where(%%%%% WHATEVER %%%%).Take(takeMax.HasValue && takeMax.Value > 0 ? takeMax.Value :  ?????? ).ToList();
}

如果takeMax 为NULL,我如何取走所有物品?

Take() 需要 int ,我不想写类似

int total = DB_Context.Employees.Count();
var items = DB_Context.Employees.Where(%%%%% WHATEVER %%%%).Take(takeMax.HasValue && takeMax.Value > 0 ? takeMax.Value :  total ).ToList();

还有其他选择吗?

【问题讨论】:

  • 您可能希望在您的条件中添加大括号并进行检查。它对我来说很好,没有任何错误

标签: c# entity-framework linq visual-studio linq-to-entities


【解决方案1】:

你只能在这种情况下应用镜头:

var itemsQuery = DB_Context.Employees.Where(%%%%% WHATEVER %%%%);
if (takeMax > 0)
{
  itemsQuery  = itemsQuery.Take(takeMax);
}

var items = itemsQuery.ToList();

【讨论】:

  • 甚至比我的更好(现已删除)if...else 方法。两者都使用相同的Where
  • 我可能不建议这样做,因为我可能只想要数据库中数千行中的 10 行。我不应该全部收回。
  • @TimSchmelter Take() 当您不想检索所有内容时使用(SELECT TOP n),所以我希望在获取时过滤记录而不是在它之后(获取所有记录然后 Take())
  • 你不需要HasValue 部分read this
  • @Nikita:我猜你还没有理解 LINQ 的延迟执行。查询不是在第一行而是在最后一行执行。
【解决方案2】:

这是一种方式,您仍然需要编写两行代码(例如您的计数示例),但您不必计算 Count

var query = DB_Context.Employees.Where(%%%%% WHATEVER %%%%);
var items = takeMax.HasValue && takeMax.Value > 0 ? 
                query.Take(takeMax.Value).ToList() : query.ToList();

【讨论】:

  • 您的意思是查询的评估将在第二行中完成,对吧?不错的一个。
  • @ron 是的,在您执行 ToList()foreach 之前,不会评估查询。
【解决方案3】:

可能是这样的:

public List<Employees> getEmployees(....... , int? takeMax = null)
{
// some code 


...

if(takeMax != null)
{
    return DB_Context.Employees.Where(%%%%% WHATEVER %%%%).Take(takeMax).ToList();
}
else
{
    return return DB_Context.Employees.Where(%%%%% WHATEVER %%%%).ToList();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2011-09-10
    • 2020-11-23
    • 2018-12-14
    相关资源
    最近更新 更多