質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

3回答

614閲覧

C# Visual Studio2019 にて、Linq のWhereの条件を動的に設定したいのですが??

Kazu.

総合スコア10

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2020/10/15 03:05

編集2020/10/15 06:55

C# Visual Studio2019 にて、Linq のWhereの検索条件のプロパティー部分を動的に設定したいと考えておりますが、
式木を使って実現可能かと考えているのですが、使い方が良く分かりません。ご存知の方がおられましたら、宜しくお願いします。
下記コードのifでPv1~Pv21を判定している部分のPvを変数として与えたいと考えています。

・制作対象は、WPFとなります。開発環境は、Windows10、.Net Core3.1 となります。

宜しくお願いします。

namespace Test_Expression { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public string LabelText; private MainWindowViewModel _viewModel; public class SerchData { public string Pv1; public string Pv2; public string Pv3; public string Pv4; public string Pv5; public string Pv6; public string Pv7; public string Pv8; public string Pv9; public string Pv10; public string Pv11; public string Pv12; public string Pv13; public string Pv14; public string Pv15; public string Pv16; public string Pv17; public string Pv18; public string Pv19; public string Pv20; public string Pv21; } public MainWindow() { InitializeComponent(); DataContext = new { LabelText }; _viewModel = new MainWindowViewModel { LabelText = "検索文字A~Z" }; this.DataContext = _viewModel; } public class MainWindowViewModel : INotifyPropertyChanged { private string labelText; public string LabelText { get { return labelText; } set { labelText = value; OnPropertyChanged("LabelText"); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public void Button1_Click(object sender, RoutedEventArgs e) { List<SerchData> serchDatas = new List<SerchData>(); SerchData serchData = new SerchData(); serchData.Pv1 = "a"; serchData.Pv2 = "b"; serchData.Pv3 = "c"; serchData.Pv4 = "d"; serchData.Pv5 = "e"; serchData.Pv6 = "f"; serchData.Pv7 = "g"; serchData.Pv8 = "h"; serchData.Pv9 = "i"; serchData.Pv10 = "j"; serchData.Pv11 = "k"; serchData.Pv12 = "l"; serchData.Pv13 = "m"; serchData.Pv14 = "n"; serchData.Pv15 = "o"; serchData.Pv16 = "p"; serchData.Pv17 = "q"; serchData.Pv18 = "r"; serchData.Pv19 = "s"; serchData.Pv15 = "t"; serchData.Pv16 = "u"; serchData.Pv17 = "v"; serchData.Pv18 = "w"; serchData.Pv19 = "x"; serchData.Pv20 = "y"; serchData.Pv21 = "z"; serchDatas.Add(serchData); string al = "v"; if (serchDatas.Where(o => o.Pv1 == al).Count() >= 1) { _viewModel.LabelText = "Pv1"; } if (serchDatas.Where(o => o.Pv2 == al).Count() >= 1) { _viewModel.LabelText = "Pv2"; } if (serchDatas.Where(o => o.Pv3 == al).Count() >= 1) { _viewModel.LabelText = "Pv3"; } if (serchDatas.Where(o => o.Pv4 == al).Count() >= 1) { _viewModel.LabelText = "Pv4"; } if (serchDatas.Where(o => o.Pv5 == al).Count() >= 1) { _viewModel.LabelText = "Pv5"; } if (serchDatas.Where(o => o.Pv6 == al).Count() >= 1) { _viewModel.LabelText = "Pv6"; } if (serchDatas.Where(o => o.Pv7 == al).Count() >= 1) { _viewModel.LabelText = "Pv7"; } if (serchDatas.Where(o => o.Pv8 == al).Count() >= 1) { _viewModel.LabelText = "Pv8"; } if (serchDatas.Where(o => o.Pv9 == al).Count() >= 1) { _viewModel.LabelText = "Pv9"; } if (serchDatas.Where(o => o.Pv10 == al).Count() >= 1) { _viewModel.LabelText = "Pv10"; } if (serchDatas.Where(o => o.Pv11 == al).Count() >= 1) { _viewModel.LabelText = "Pv11"; } if (serchDatas.Where(o => o.Pv12 == al).Count() >= 1) { _viewModel.LabelText = "Pv12"; } if (serchDatas.Where(o => o.Pv13 == al).Count() >= 1) { _viewModel.LabelText = "Pv13"; } if (serchDatas.Where(o => o.Pv14 == al).Count() >= 1) { _viewModel.LabelText = "Pv14"; } if (serchDatas.Where(o => o.Pv15 == al).Count() >= 1) { _viewModel.LabelText = "Pv15"; } if (serchDatas.Where(o => o.Pv16 == al).Count() >= 1) { _viewModel.LabelText = "Pv16"; } if (serchDatas.Where(o => o.Pv17 == al).Count() >= 1) { _viewModel.LabelText = "Pv17"; } if (serchDatas.Where(o => o.Pv18 == al).Count() >= 1) { _viewModel.LabelText = "Pv18"; } if (serchDatas.Where(o => o.Pv19 == al).Count() >= 1) { _viewModel.LabelText = "Pv19"; } if (serchDatas.Where(o => o.Pv20 == al).Count() >= 1) { _viewModel.LabelText = "Pv20"; } if (serchDatas.Where(o => o.Pv21 == al).Count() >= 1) { _viewModel.LabelText = "Pv21"; } } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/10/15 03:55

serchDatasに項目が1つしかないのにWhereを使う意味がありますか?
退会済みユーザー

退会済みユーザー

2020/10/15 03:58

コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 第三者ななおさらです(なので自分はまだコードは読んでません)。 何を作っているか(WPF?) と開発環境(OS, .NET Framework のバージョンなど)を質問欄を編集して追記してください。
Kazu.

2020/10/15 04:07

・制作対象は、WPFとなります。開発環境は、Windows10、.Net Core3.1 となります。 ・コードは、今後``` 理解致しました。以後、気を付けたいと思います。 ・項目が一つしかないのは、テストコードで実現したい内容をシンプルに表現したいと思った事が要因です。  実際にやりたいのは、データベースの検索でして、対象とするデータレコードが、かなり多く存在しております。
Automatic9045

2020/10/15 04:29

投稿後でも質問文は編集できるので反映して下さい。 特にコードの整形は見やすさのために重要なので…
Kazu.

2020/10/15 04:38

編集できるのですね。了解致しました。
Zuishin

2020/10/15 04:44

条件が複雑なら、式木では自分でメンテナンスしきれなくなると思います。 データベースの検索なら SQL で行うのが良いでしょう。それなら単に文字列を連結するだけです。
退会済みユーザー

退会済みユーザー

2020/10/15 04:55 編集

何を作っているか(WPF?) と開発環境(OS, .NET Framework のバージョンなど)を質問欄を編集して追記してください。 「質問欄を編集して追記」とお願いしたはずです。
kenshirou

2020/10/15 06:19

Dictionary<string, string>じゃダメなんですか?
Kazu.

2020/10/15 06:56

質問欄を編集して追記致しました。
Zuishin

2020/10/15 07:55

条件が複雑なら、式木では自分でメンテナンスしきれなくなると思います。 データベースの検索なら SQL で行うのが良いでしょう。それなら単に文字列を連結するだけです。
Zuishin

2020/10/15 07:57

質問のコードに式木らしきものが一切見当たりませんが、そもそも使えるんですか?
Zuishin

2020/10/15 07:58

それ以前に、式木が何かは知っているんですか?
Zuishin

2020/10/15 07:59

なぜ式木を使おうと考えたんですか? ほかの方法を検討しましたか? 検討した方法と、検討した結果、棄却した理由は何ですか?
Kazu.

2020/10/15 10:26

ご指摘のように、SQL文を文字列で定義して、置換、連結で実行は経験がありまして、内容は理解しております。ただ、今回のアプリケーションの制作では、Linqのメソッド式で、データベースの検索を構築しておりますして、動的にプロパティを変更できないか調べていく中で、式木の情報にたどり着いたのですが、やりたい事が出来そうな雰囲気のみで、詳細が理解出来ておりません。難易度が高い様子でしたので質問させて頂きました。
Zuishin

2020/10/15 11:51

難易度が高いのであれば、別の方法をとったほうが良いと思いますが。誰がメンテするんですか?
Zuishin

2020/10/15 12:26

クエリプロバイダーを作成するということですよね? 一般的な方法を教えたとして、誰がそれを習得して実務に合わせて使いこなすんですか?
Zuishin

2020/10/16 04:03

言葉を変えましょうか。 プロバイダーの作成方法までたどり着いたようですが、それが理解できなかったんですよね? それをここで聞いて理解できますか? ネットでみつかる情報は、わざと難しく書いているわけではありません。自分がどこまで理解できたかを示さなければ、回答者はそれと同レベルの情報を書くことになるでしょう。 かみ砕いて解説してほしい場合、質問者が難易度が高いと感じるレベル、そして理解できるレベルがどこなのか、つまりどこまで読んでどこでわからなくなったのかを明示しなければいけません。 あるいはただ作業してコードを作って欲しいだけなら、仕様の詳細をきちんとまとめた上で有料のサービスに持ち込んでください。
Kazu.

2020/10/16 11:08

ご指摘頂いております内容、色々と調べながら試行錯誤を進めておりますので、まとめさせて頂きます。 しばしお待ちください。
guest

回答3

0

_viewModel.LabelTextを更新しているだけなので、下記で十分ではないでしょうか。

C#

1var index = "abcdefghijklmnopqrstuvwxyz".IndexOf("v"); 2_viewModel.LabelText = "Pv" + (index + 1);

Whereを使う縛りなら下記で取得できます。

C#

1var index = "abcdefghijklmnopqrstuvwxyz" 2 .Select((alphabet,index) => new {alphabet,index}) 3 .Where(x => x.alphabet == "v") 4 .Select(x => x.index) 5 .First(); 6_viewModel.LabelText = "Pv" + (index + 1);

投稿2020/10/15 05:25

編集2020/10/15 05:27
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenshirou

2020/10/15 06:27

質問者さんのコードをよく見ると、serchData.Pv15~19の代入の後、また別の値でserchData.Pv15以降を代入しているようなので、この方法は使えないのではないかと思います。
BluOxy

2020/10/15 06:43

コメントありがとうございます。よく見るとそのようですね。 代わりに、文字列を"abcdefghijklmntuvwxyz"に変更すると_viewModel.LabelTextには意図した値は一応入れられそうです。 しかし、上の回答は1文字の文字列に対する検索の話なので普通の文字列を検索したい場合は使えないです。 やはり、文字列のコレクションに要素を追加し、SelectなりFirstなりで求めるのが良さそうです。
Kazu.

2020/10/17 00:19

indexを使う方法、ありがとうございます。 今後の参考とさせて頂きます。
guest

0

自己解決

自分なりに解決したコード投稿させて頂きます。Predicate.GetPredicateメソッドに検索対象を引数と
して渡すと、ラムダ式を生成します。

namespace Test_Expression { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public string LabelText; public List<SerchData> serchDatas = new List<SerchData>(); private MainWindowViewModel _viewModel; public SerchData serchData = new SerchData(); public class SerchData { public string Pv1 { get; set; } public string Pv2 { get; set; } public string Pv3 { get; set; } public string Pv4 { get; set; } public string Pv5 { get; set; } public string Pv6 { get; set; } public string Pv7 { get; set; } public string Pv8 { get; set; } public string Pv9 { get; set; } public string Pv10 { get; set; } public string Pv11 { get; set; } public string Pv12 { get; set; } public string Pv13 { get; set; } public string Pv14 { get; set; } public string Pv15 { get; set; } public string Pv16 { get; set; } public string Pv17 { get; set; } public string Pv18 { get; set; } public string Pv19 { get; set; } public string Pv20 { get; set; } public string Pv21 { get; set; } } public MainWindow() { InitializeComponent(); DataContext = new { LabelText }; _viewModel = new MainWindowViewModel { LabelText = "検索文字A~Z" }; this.DataContext = _viewModel; serchData.Pv1 = "a"; serchData.Pv2 = "b"; serchData.Pv3 = "c"; serchData.Pv4 = "d"; serchData.Pv5 = "e"; serchData.Pv6 = "f"; serchData.Pv7 = "g"; serchData.Pv8 = "h"; serchData.Pv9 = "i"; serchData.Pv10 = "j"; serchData.Pv11 = "k"; serchData.Pv12 = "l"; serchData.Pv13 = "m"; serchData.Pv14 = "n"; serchData.Pv15 = "o"; serchData.Pv16 = "p"; serchData.Pv17 = "q"; serchData.Pv18 = "r"; serchData.Pv19 = "s"; serchData.Pv15 = "t"; serchData.Pv16 = "u"; serchData.Pv17 = "v"; serchData.Pv18 = "w"; serchData.Pv19 = "x"; serchData.Pv20 = "y"; serchData.Pv21 = "z"; serchDatas.Add(serchData); } public class MainWindowViewModel : INotifyPropertyChanged { private string labelText; public string LabelText { get { return labelText; } set { labelText = value; OnPropertyChanged("LabelText"); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public void Button1_Click(object sender, RoutedEventArgs e) { //検索 If文の羅列 string al = "v"; if (serchDatas.Where(o => o.Pv1 == al).Count() >= 1) { _viewModel.LabelText = "Pv1"; } if (serchDatas.Where(o => o.Pv2 == al).Count() >= 1) { _viewModel.LabelText = "Pv2"; } if (serchDatas.Where(o => o.Pv3 == al).Count() >= 1) { _viewModel.LabelText = "Pv3"; } if (serchDatas.Where(o => o.Pv4 == al).Count() >= 1) { _viewModel.LabelText = "Pv4"; } if (serchDatas.Where(o => o.Pv5 == al).Count() >= 1) { _viewModel.LabelText = "Pv5"; } if (serchDatas.Where(o => o.Pv6 == al).Count() >= 1) { _viewModel.LabelText = "Pv6"; } if (serchDatas.Where(o => o.Pv7 == al).Count() >= 1) { _viewModel.LabelText = "Pv7"; } if (serchDatas.Where(o => o.Pv8 == al).Count() >= 1) { _viewModel.LabelText = "Pv8"; } if (serchDatas.Where(o => o.Pv9 == al).Count() >= 1) { _viewModel.LabelText = "Pv9"; } if (serchDatas.Where(o => o.Pv10 == al).Count() >= 1) { _viewModel.LabelText = "Pv10"; } if (serchDatas.Where(o => o.Pv11 == al).Count() >= 1) { _viewModel.LabelText = "Pv11"; } if (serchDatas.Where(o => o.Pv12 == al).Count() >= 1) { _viewModel.LabelText = "Pv12"; } if (serchDatas.Where(o => o.Pv13 == al).Count() >= 1) { _viewModel.LabelText = "Pv13"; } if (serchDatas.Where(o => o.Pv14 == al).Count() >= 1) { _viewModel.LabelText = "Pv14"; } if (serchDatas.Where(o => o.Pv15 == al).Count() >= 1) { _viewModel.LabelText = "Pv15"; } if (serchDatas.Where(o => o.Pv16 == al).Count() >= 1) { _viewModel.LabelText = "Pv16"; } if (serchDatas.Where(o => o.Pv17 == al).Count() >= 1) { _viewModel.LabelText = "Pv17"; } if (serchDatas.Where(o => o.Pv18 == al).Count() >= 1) { _viewModel.LabelText = "Pv18"; } if (serchDatas.Where(o => o.Pv19 == al).Count() >= 1) { _viewModel.LabelText = "Pv19"; } if (serchDatas.Where(o => o.Pv20 == al).Count() >= 1) { _viewModel.LabelText = "Pv20"; } if (serchDatas.Where(o => o.Pv21 == al).Count() >= 1) { _viewModel.LabelText = "Pv21"; } } private void Button2_Click(object sender, RoutedEventArgs e) { //式木で検索 string al = "v"; string pv="Pv"; for(int cou = 1; cou <= 21; cou++) { string pvn = pv + cou.ToString(); var result = serchDatas.Where(Predicate.GetPredicate(al, pvn)); if (result.Count() == 1) { _viewModel.LabelText = pvn; } } } public class Predicate { public static Func<SerchData,bool>GetPredicate(string al,string pv) { ParameterExpression param = System.Linq.Expressions.Expression.Parameter(typeof(SerchData), "r"); MemberExpression left = System.Linq.Expressions.Expression.Property(param, pv); var right = System.Linq.Expressions.Expression.Constant(al, typeof(string)); BinaryExpression body = System.Linq.Expressions.Expression.Equal(left, right); return System.Linq.Expressions.Expression.Lambda<Func<SerchData, bool>>(body, param).Compile(); } } } }

投稿2020/10/17 00:11

Kazu.

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

いちいち変数名変えるより、あっさり配列にしてはどうでしょう
pv[変数] でアクセスできますよ

投稿2020/10/15 03:34

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazu.

2020/10/15 04:01

早速のご回答、ありがとうございます。 アドバイス頂きましたように配列にするというのは、一策なのですが、実際に行いたいのは、 データベースの検索でして、出来れば、式木でメソッドを定義したいと考えております。
y_waiwai

2020/10/15 04:23

まずはその一策をコードにしてみれば。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問