2017-01-19 11 views
0

この質問は以前に尋ねられましたが、見つけられませんでした。 最終的にユーザーが決定するいくつかの基準に応じて、テーブル名のリストをフィルタリングしたいと考えています。以下は私の現在のコードです。複数の値でLinqフィルタが存在している場合と存在しない場合があります

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; 
} 

私はまだフィルタリング操作でTableMetaData.TableNameとTableMetaData.ReferenceTableNameを含める必要があります。ただし、これらの値はNULLになる可能性があります。その場合、これらの値はフィルタで使用されません。私は、各条件ごとに別々のlinq文を書くよりも、これを行うより簡単な方法が必要であると思いますか?

ありがとうございます。

答えて

1

使用できますか?次のようにこれを手伝ってください:

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; 
} 
+0

これは私のためにうまく動作します。私は、このソリューションは、andとorの組み合わせを使用するよりも読みやすいと思います。ありがとうございました。 – user1165224

+0

@ user1165224喜んで助けました。 –

1

確かにこれを行うことができます。実際の条件の前に、or節でヌルチェックを適用するだけです。

例:

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; 
} 
0

あなたはそれらを使用する前に、(「」)これらの文字列のいずれかがnullまたは空であるかどうかを判断するためにstring.IsNullOrEmptyメソッドを使用することができます。このような何か:

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; 
} 
3

はあなたが別のWhere呼び出しを使用することができ、それをより読みやすくなります(私の意見では)

var nameQuery = tableMetaData 
    .Where(table => (table.IsAuditTable == filterData.IsAuditTable) 
     && (table.IsSyncTable == filterData.IsSyncTable) 
     && (table.IsView == filterData.IsView)); 

if (filterData.TableName != null) 
    nameQuery = nameQuery.Where(table => table.TableName == filterData.TableName); 

if (filterData.ReferenceTableName != null) 
    nameQuery = nameQuery.Where(table => table.ReferenceTableName == filterData.ReferenceTableName); 

// more criteria .. 

return nameQuery.Select(table => table.TableName).ToList(); 
+0

これは私の最初の試みでしたが、コンパイルされません。 nameQueryはLIst <>型の項目になり、結果はIEnumerable <>型であるため、2番目のフィルタで設定することはできません。修正するのは簡単ですが、もっと簡単な解決方法があると思いました。 – user1165224

+0

もちろんこれは正解です。 +1 @ user1165224あなたが 'ToList()'を呼ばないと 'list 'になる 'nameQuery'はありません。 –

+0

私は上記で入力したが、エラーは発生しなかった(かっこを修正)。私は初めて面白いことをしたに違いない。それ以上の条件があれば、長いlinq文よりも読みやすくするために、それらを分割することを好むでしょう。 – user1165224

関連する問題