gpt4 book ai didi

c# - 您将如何重构此 LINQ 代码?

转载 作者:行者123 更新时间:2023-11-30 19:08:31 24 4
gpt4 key购买 nike

我有很多看起来像这样的丑陋代码:

if (!string.IsNullOrEmpty(ddlFileName.SelectedItem.Text))
results = results.Where(x => x.FileName.Contains(ddlFileName.SelectedValue));
if (chkFileName.Checked)
results = results.Where(x => x.FileName == null);

if (!string.IsNullOrEmpty(ddlIPAddress.SelectedItem.Text))
results = results.Where(x => x.IpAddress.Contains(ddlIPAddress.SelectedValue));
if (chkIPAddress.Checked)
results = results.Where(x => x.IpAddress == null);

...etc.

results是一个 IQueryable<MyObject> .
这个想法是,对于这些无数的下拉菜单和复选框中的每一个,如果下拉菜单选择了某些内容,则用户希望匹配该项目。如果选中该复选框,则用户特别需要那些字段为空或空字符串的记录。 (UI 不允许同时选择两者。)所有这些都添加到最后执行的 LINQ 表达式,在我们添加了所有条件之后。

似乎应该有某种方法可以提取 Expression<Func<MyObject, bool>>一两个,这样我就可以将重复的部分放在一个方法中,然后只传递更改的内容。我在其他地方做过这个,但是这组代码让我受阻了。 (另外,我想避免使用“Dynamic LINQ”,因为我想尽可能保持类型安全。)有什么想法吗?

最佳答案

我会将其转换为单个 Linq 语句:

var results =
//get your inital results
from x in GetInitialResults()
//either we don't need to check, or the check passes
where string.IsNullOrEmpty(ddlFileName.SelectedItem.Text) ||
x.FileName.Contains(ddlFileName.SelectedValue)
where !chkFileName.Checked ||
string.IsNullOrEmpty(x.FileName)
where string.IsNullOrEmpty(ddlIPAddress.SelectedItem.Text) ||
x.FileName.Contains(ddlIPAddress.SelectedValue)
where !chkIPAddress.Checked ||
string.IsNullOrEmpty(x. IpAddress)
select x;

它并没有更短,但我发现这个逻辑更清晰。

关于c# - 您将如何重构此 LINQ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963/

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