gpt4 book ai didi

c# - 用于链接查询组合的 Linq 语法

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:07 25 4
gpt4 key购买 nike

在某些情况下,我有多种选择,需要根据所选内容过滤数据(在本例中使用 EF)。有没有比列出所有组合更简洁的方式来编写以下内容?

我下面的初步尝试似乎过于复杂,尤其是当组合变得更大时。

DateTime today = DateTime.Now.Date;
DateTime yesterday = today.AddDays(-1);
DateTime tomorrow = today.AddDays(1);

var query = db.Products.AsQueryable();
if (userSettings.DisplayYesterday && userSettings.DisplayToday && userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == yesterday || DbFunctions.TruncateTime(x.ListedTime) == today || DbFunctions.TruncateTime(x.ListedTime) == tomorrow);
}
else if (!userSettings.DisplayYesterday && userSettings.DisplayToday && userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == today || DbFunctions.TruncateTime(x.ListedTime) == tomorrow);
}
else if (userSettings.DisplayYesterday && !userSettings.DisplayToday && userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == yesterday || DbFunctions.TruncateTime(x.ListedTime) == tomorrow);
}
else if (userSettings.DisplayYesterday && userSettings.DisplayToday && !userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == yesterday || DbFunctions.TruncateTime(x.ListedTime) == today);
}
else if (!userSettings.DisplayYesterday && !userSettings.DisplayToday && userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == tomorrow);
}
else if (!userSettings.DisplayYesterday && userSettings.DisplayToday && !userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == today);
}
else if (userSettings.DisplayYesterday && !userSettings.DisplayToday && !userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == yesterday);
}
else if (userSettings.DisplayYesterday && !userSettings.DisplayToday && !userSettings.DisplayTomorrow)
{
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == yesterday);
}
else if (!userSettings.DisplayYesterday && !userSettings.DisplayToday && !userSettings.DisplayTomorrow)
{
// If nothing is selected then default to today
query = query.Where(x => DbFunctions.TruncateTime(x.ListedTime) == today);
}

List<Products> productList = await query.ToListAsync();

最佳答案

是的,您可以安装 LinqKit nuget 包并使用其 PredicateBuilder(如果出于某种原因您不能\不想安装第三方包 - 您可以自己实现类似的功能)。使用 PredicateBuilder,您可以这样做:

// start with false, because building OR expression
// and false OR something is the same as just something
var condition = PredicateBuilder.New<Product>(false);
if (userSettings.DisplayYesterday)
condition = condition.Or(x => DbFunctions.TruncateTime(x.ListedTime) == yesterday);
if (userSettings.DisplayToday)
condition = condition.Or(x => DbFunctions.TruncateTime(x.ListedTime) == today);
if (userSettings.DisplayTomorrow)
condition = condition.Or(x => DbFunctions.TruncateTime(x.ListedTime) == tomorrow);
query = query.Where(condition);

如果您使用 AND(而不是像此处那样的 OR)连接多个条件,则不需要谓词构建器,只需链接 Where 调用:

if (someCondition)
query = query.Where(x => x.SomeField == someValue);
if (anotherCondition)
query = query.Where(x => x.SomeAnotherField == someAnotherValue);

关于c# - 用于链接查询组合的 Linq 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47488806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com