1. ホーム
  2. linq

Linqにおける複数のWHERE句

2023-10-15 07:29:16

質問

私はLINQの初心者で、複数のwhere句を実行する方法を知りたいのです。これは私が達成したいことです:特定のユーザー名をフィルタリングすることによってレコードを返します。私は以下のコードを試してみましたが、期待どおりに動作しません。

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where ((r.Field<string>("UserName") != "XXXX") || (r.Field<string>("UserName") != "XXXX"))                            
            select r;    

            DataTable newDT = query.CopyToDataTable();

事前に助けをありがとうございました!!!

どのように解決するのですか?

複数の"where"節を直接記述すればよいのですが、そうしたいとは思えませんね。複数の "where"節があると、最終的に より 制限の強いフィルタになってしまいます。 より少ない 制限をかけることができます。私はあなたが本当に欲しいと思っています。

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" &&
                  r.Field<string>("UserName") != "YYYY"
            select r;

DataTable newDT = query.CopyToDataTable();

||の代わりに&&があることに注意してください。ユーザ名がXXXXでない場合に行を選択したい場合。 で、ユーザー名がYYYYでない場合、その行を選択したいのです。

EDIT: もし、コレクション全体を持っているなら、もっと簡単です。そのコレクションが ignoredUserNames :

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where !ignoredUserNames.Contains(r.Field<string>("UserName"))
            select r;

DataTable newDT = query.CopyToDataTable();

理想的には、これを HashSet<string> を避けるために Contains の呼び出しに長い時間がかかるのを避けるためですが、コレクションが十分に小さければ、それほど大きな影響はないでしょう。