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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

LINQ

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

Q&A

解決済

3回答

3302閲覧

LINQでランダムに1つの項目を取り出したいです。

lovelydai

総合スコア38

C#

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

LINQ

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

0グッド

0クリップ

投稿2019/12/27 08:01

こんにちは、LINQの使い方というか、うまくできなかったことを質問したいと思います。
ある運動情報があるDBテーブルから、goodtypeidというid値と一致する項目の中でランダムに1つだけ取り出したいです。
現在は、FristOrDefault()を使っていますが、これだとorderbyで決まった並び順の最先の項目が取り出されます。

var execquery = (from e in model.exercises  where e.goodtypeid == TypeId && e.flag == true && e != null  orderby e.id select new {  execname = e.exercisename, execmemo = e.exercisememo, effect = e.effect.effectname, execrefer = e.reference }).FirstOrDefault();

ググったら、Randomを使う方法、ElementAtを使う方法、色々ありましたが、全部できませんでした。何かいい方法があれば教えてください。

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

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

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

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

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

tamoto

2019/12/27 08:04

「全部できませんでした。」とはどれをどう試してどうダメだったのかも書かなければいけません。
guest

回答3

0

ベストアンサー

ランダムに一つ取得するなら、OrderByにランダムな値を渡してシャッフルし、一番上を取り出せばいいかなと

これは偶数の中から一つを取り出すサンプルです。

C#

1var s = new [] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 2var t = s.Where(i => i % 2 == 0).OrderBy(_ => Guid.NewGuid()).FirstOrDefault();

投稿2019/12/27 11:43

ww155

総合スコア32

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

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

lovelydai

2020/01/09 08:22

ありがとうございました。大変参考になりました。
guest

0

まず、goodtypeidが一致するデータだけで絞り込みをかけます
仮に10件だとしたら、0~9をランダムに決めてその番目のデータを取得すればいいです

サンプルとしてはこんな感じでしょうか

var narrow= data.Where(n => n.goodtypeid == goodtypeid); var takedata = narrow.Skip(random.Next(narrow.Count())).Take(1);

投稿2019/12/27 08:22

編集2019/12/27 10:20
izmktr

総合スコア2856

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

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

退会済みユーザー

退会済みユーザー

2019/12/27 09:34

これ、絞り込めてないですよ。SelectではなくWhereでは?
izmktr

2019/12/27 10:20

あ、本当ですね、ありがとうございます
Zuishin

2019/12/27 10:29

Take だと戻り値の型が変わりますね。
Zuishin

2019/12/27 10:36

それと、narrow が複数回評価されているので効率が悪いです。
lovelydai

2020/01/09 08:28

コメントありがとうございます。
guest

0

かなり迷いましたが、以下のように解決しました。
query結果をToList()又はToArray()に変換し、その中からひとつランダムで値を持ってくる形です。
ひとつで解決しようとせず、わけて処理したら意外と簡単な問題でした。TT

var foodquery = (from f in model.foods   where f.goodtypeid == TypeId && f.flag == true && f != null orderby f.id select new {  foodname = f.foodname, foodmemo = f.foodmemo, }).ToList(); // <方法1> //Random rnd = new Random(); //var foodcontent = foodquery.ElementAt(rnd.Next(foodquery.Count())); // <方法2>:ww155様からのコメントを参考 var foodcontent = foodquery.OrderBy(_ => Guid.NewGuid()).FirstOrDefault();

投稿2020/01/09 08:27

lovelydai

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問