gpt4 book ai didi

c# - 使用 Linq 进行动态过滤

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

我有一个 List<Device> .在Device class有4个属性,分别是Name , OperatingSystem , StatusLastLoggedInUser .我需要写一个方法:

IQueryable<Device> FilterDeviceList(
List<Device> Devices,
List<string> filter,
string filterValue)

哪里filter将包含过滤选项 "name" , "os"指示要包含在搜索中的字段。如果"all"已通过,则需要包含所有 4 个字段。 filtervalue将包含要过滤的值,如 "windows" , "Calvin" .

谁能推荐一种实现此目的的方法?

编辑:

如果我不清楚,我正在像这样进行过滤,这是我需要代码的注释部分。

if(filter.contains(name))
{
//filter with name
}
if( filter.contains(both name and os)
{
// I only need the filter value to contain in name or OS (only needed in any one of the field,not necessary to be in both)

}`

最佳答案

您可以按如下方式构建查询:

private static IQueryable<Device> FilterDeviceList(List<Device> devices, Device device)
{
var query = devices.AsQueryable();

if (device.Name != null)
query = query.Where(d => d.Name == device.Name);

if (device.OS != null)
query = query.Where(d => d.OS == device.OS);

if (device.Status != null)
query = query.Where(d => d.Status == device.Status);

if (device.LastLoggedInUser != null)
query = query.Where(d => d.LastLoggedInUser == device.LastLoggedInUser);

return query;
}

然后你可以用一个设备对象调用这个函数。 IE。如果要包含名称,只需传递一个带有名称的设备对象(将其他属性保留为默认值)。如果您希望包含所有内容,请传入一个包含所有内容的设备对象:

var r = FilterDeviceList(devices, new Device
{
Name = "yourFilterValue",
OS = "yourFilterValue",
LastLoggedInUser = "yourFilterValue",
Status = "yourFilterValue"
});

编辑、过滤名称属性:

var r = FilterDeviceList(devices, new Device
{
Name = "yourFilterValue"
});

编辑2,看看predicatebuilder

var predicate = PredicateBuilder.False<Device>();

if(document.Name != null)
predicate = predicate.Or(d => d.Name == document.Name);

if(document.OS != null)
predicate = predicate.Or(d => d.OS == document.OS);

return devices.Where(predicate);

关于c# - 使用 Linq 进行动态过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21675568/

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