C# Linq按可能存在或可能不存在的多个值进行筛选

C# Linq按可能存在或可能不存在的多个值进行筛选,c#,linq,list,filter,C#,Linq,List,Filter,我肯定以前有人问过这个问题,但我一直找不到。 我想根据用户最终确定的几个条件筛选表名列表。以下是我目前的代码 private List<TableMetaData> tableMetaData = new List<TableMetaData>(); public class TableMetaData { public string TableName; public string ReferenceTableName; public bool

我肯定以前有人问过这个问题,但我一直找不到。 我想根据用户最终确定的几个条件筛选表名列表。以下是我目前的代码

private List<TableMetaData> tableMetaData = new List<TableMetaData>();
public class TableMetaData
{
    public string TableName;
    public string ReferenceTableName;
    public bool IsAuditTable;
    public bool IsSyncTable;
    public bool IsView;
}
public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView))
        .Select(table => table.TableName).ToList();

    return filteredNames;
}
private List tableMetaData=new List();
公共类表元数据
{
公共字符串表名;
公共字符串ReferenceTableName;
公共文件是可审计的;
公共布尔是可同步的;
公众视野;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}
我仍然需要在筛选操作中包括TableMetaData.TableName和TableMetaData.ReferenceTableName。但是,这些值可以为null,在这种情况下,它们不会在过滤器中使用。我想一定有比为每个条件编写单独的linq语句更简单的方法来实现这一点


先谢谢你

你能用吗?操作员可通过以下方式帮助您:

public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView)
            && (filterData.ReferenceTableName == null ? true : table.ReferenceTableName == filterData.ReferenceTableName)
            && (filterData.TableName == null ? true : table.TableName == filterData.TableName))
        .Select(table => table.TableName).ToList();

    return filteredNames;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView)
&&(filterData.ReferenceTableName==null?true:table.ReferenceTableName==filterData.ReferenceTableName)
&&(filterData.TableName==null?true:table.TableName==filterData.TableName))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}

您可以使用?操作员可通过以下方式帮助您:

public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView)
            && (filterData.ReferenceTableName == null ? true : table.ReferenceTableName == filterData.ReferenceTableName)
            && (filterData.TableName == null ? true : table.TableName == filterData.TableName))
        .Select(table => table.TableName).ToList();

    return filteredNames;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView)
&&(filterData.ReferenceTableName==null?true:table.ReferenceTableName==filterData.ReferenceTableName)
&&(filterData.TableName==null?true:table.TableName==filterData.TableName))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}

您一定能做到这一点。只需在实际条件之前的or子句中应用null检查

例如:

public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView)
            && ((table.TableName == null) || (table.TableName == "Something"))
            && ((table.ReferenceTableName == null) || (table.ReferenceTableName == "Something")))
        .Select(table => table.TableName).ToList();
    return filteredNames;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView)
&&((table.TableName==null)| |(table.TableName==“某物”))
&&((table.ReferenceTableName==null)| |(table.ReferenceTableName==Something)))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}

您一定能做到这一点。只需在实际条件之前的or子句中应用null检查

例如:

public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView)
            && ((table.TableName == null) || (table.TableName == "Something"))
            && ((table.ReferenceTableName == null) || (table.ReferenceTableName == "Something")))
        .Select(table => table.TableName).ToList();
    return filteredNames;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView)
&&((table.TableName==null)| |(table.TableName==“某物”))
&&((table.ReferenceTableName==null)| |(table.ReferenceTableName==Something)))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}

您可以使用
字符串.IsNullOrEmpty
方法来确定这些字符串中的任何一个在使用之前是
null
还是空(“”)。大概是这样的:

public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView)
        && (string.IsNullOrEmpty(filterData.ReferenceTableName) || table.TableName == filterData.TableName)
        && (string.IsNullOrEmpty(filterData.ReferenceTableName) || table.ReferenceTableName == filterData.ReferenceTableName))
        .Select(table => table.TableName).ToList();

    return filteredNames;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView)
&&(string.IsNullOrEmpty(filterData.ReferenceTableName)| | table.TableName==filterData.TableName)
&&(string.IsNullOrEmpty(filterData.ReferenceTableName)| | table.ReferenceTableName==filterData.ReferenceTableName))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}

您可以使用
字符串.IsNullOrEmpty
方法来确定这些字符串中的任何一个在使用之前是
null
还是空(“”)。大概是这样的:

public List<string> GetTableNames(TableMetaData filterData)
{
    List<string> filteredNames = tableMetaData
        .Where(table => (table.IsAuditTable == filterData.IsAuditTable)
            && (table.IsSyncTable == filterData.IsSyncTable)
            && (table.IsView == filterData.IsView)
        && (string.IsNullOrEmpty(filterData.ReferenceTableName) || table.TableName == filterData.TableName)
        && (string.IsNullOrEmpty(filterData.ReferenceTableName) || table.ReferenceTableName == filterData.ReferenceTableName))
        .Select(table => table.TableName).ToList();

    return filteredNames;
}
公共列表GetTableNames(TableMetaData filterData)
{
List filteredNames=tableMetaData
.Where(table=>(table.IsAuditTable==filterData.IsAuditTable)
&&(table.IsSyncTable==filterData.IsSyncTable)
&&(table.IsView==filterData.IsView)
&&(string.IsNullOrEmpty(filterData.ReferenceTableName)| | table.TableName==filterData.TableName)
&&(string.IsNullOrEmpty(filterData.ReferenceTableName)| | table.ReferenceTableName==filterData.ReferenceTableName))
.Select(table=>table.TableName).ToList();
返回过滤器名称;
}

您可以使用单独的
Where
调用,这使得它更可读(在我看来)


您可以使用单独的
Where
调用,这使它更具可读性(在我看来)


这是我第一次尝试,但无法编译。nameQuery成为LIst类型的项,无法在第二个筛选器中设置,因为结果的类型为IEnumerable。这是一件容易解决的事情,但我认为可能有一个更简单的解决方案。这当然是正确的答案+1@user1165224没有办法
nameQuery