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"; } } } }
serchDatasに項目が1つしかないのにWhereを使う意味がありますか?
コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 第三者ななおさらです(なので自分はまだコードは読んでません)。
何を作っているか(WPF?) と開発環境(OS, .NET Framework のバージョンなど)を質問欄を編集して追記してください。
・制作対象は、WPFとなります。開発環境は、Windows10、.Net Core3.1 となります。
・コードは、今後``` 理解致しました。以後、気を付けたいと思います。
・項目が一つしかないのは、テストコードで実現したい内容をシンプルに表現したいと思った事が要因です。
実際にやりたいのは、データベースの検索でして、対象とするデータレコードが、かなり多く存在しております。
投稿後でも質問文は編集できるので反映して下さい。
特にコードの整形は見やすさのために重要なので…
編集できるのですね。了解致しました。
条件が複雑なら、式木では自分でメンテナンスしきれなくなると思います。
データベースの検索なら SQL で行うのが良いでしょう。それなら単に文字列を連結するだけです。
何を作っているか(WPF?) と開発環境(OS, .NET Framework のバージョンなど)を質問欄を編集して追記してください。
「質問欄を編集して追記」とお願いしたはずです。
Dictionary<string, string>じゃダメなんですか?
質問欄を編集して追記致しました。
条件が複雑なら、式木では自分でメンテナンスしきれなくなると思います。
データベースの検索なら SQL で行うのが良いでしょう。それなら単に文字列を連結するだけです。
質問のコードに式木らしきものが一切見当たりませんが、そもそも使えるんですか?
それ以前に、式木が何かは知っているんですか?
なぜ式木を使おうと考えたんですか?
ほかの方法を検討しましたか?
検討した方法と、検討した結果、棄却した理由は何ですか?
ご指摘のように、SQL文を文字列で定義して、置換、連結で実行は経験がありまして、内容は理解しております。ただ、今回のアプリケーションの制作では、Linqのメソッド式で、データベースの検索を構築しておりますして、動的にプロパティを変更できないか調べていく中で、式木の情報にたどり着いたのですが、やりたい事が出来そうな雰囲気のみで、詳細が理解出来ておりません。難易度が高い様子でしたので質問させて頂きました。
難易度が高いのであれば、別の方法をとったほうが良いと思いますが。誰がメンテするんですか?
クエリプロバイダーを作成するということですよね?
一般的な方法を教えたとして、誰がそれを習得して実務に合わせて使いこなすんですか?
言葉を変えましょうか。
プロバイダーの作成方法までたどり着いたようですが、それが理解できなかったんですよね?
それをここで聞いて理解できますか?
ネットでみつかる情報は、わざと難しく書いているわけではありません。自分がどこまで理解できたかを示さなければ、回答者はそれと同レベルの情報を書くことになるでしょう。
かみ砕いて解説してほしい場合、質問者が難易度が高いと感じるレベル、そして理解できるレベルがどこなのか、つまりどこまで読んでどこでわからなくなったのかを明示しなければいけません。
あるいはただ作業してコードを作って欲しいだけなら、仕様の詳細をきちんとまとめた上で有料のサービスに持ち込んでください。
ご指摘頂いております内容、色々と調べながら試行錯誤を進めておりますので、まとめさせて頂きます。
しばしお待ちください。
回答3件
あなたの回答
tips
プレビュー