2

朝、

LINQで次のSQLステートメントを作成する方法を知りたいです。

 SELECT TOP 6 * FROM Questions
 ORDER BY NEWID()

また、これをasp.netリピーターコントロールにバインドして6つの質問を表示する方法も知りたいです。

どうもありがとう :)

4

6 に答える 6

3

Linqスタイルは

 Questions.OrderBy(q=>Guid.NewGuid()).Take(6)

DataSource次に、そのプロパティを上記に設定し、メソッドを呼び出すことによって、それをリピーターにアタッチしますDataBind

于 2012-07-23T08:12:06.767 に答える
3

NEWID()ランダムなGUIDを生成するには、関数を呼び出すことができる必要があります。これを行うには、ここNEWID()でいくつかのヒントを取り、最初にデータコンテキストの関数にマップされた疑似メソッドを作成します。

[System.Data.Linq.Mapping.Function(Name="NEWID", IsComposable=true)] 
public Guid NewId() 
{
    throw new NotImplementedException(); 
}

それが設定されたら、次の関数を使用するクエリを作成できます。

var query = dc.Questions
    .OrderBy(question => dc.NewId())
    .Take(6);

このために生成されたSQLクエリを調べることができ、一致するはずです。

于 2012-07-23T08:36:38.223 に答える
1
Questions.OrderBy(q=>Sql.NewGuid()).Take(6)

これにより、SQLステートメントでNEWID()が呼び出されます。

于 2021-09-18T07:37:43.037 に答える
0
(from db in context.Questions
order by Guid.NewGuid()
select db).Take(6);
于 2012-07-23T08:18:38.730 に答える
0

私は答えがすでに選択されていることを知っていますが、それでも私はこれを達成するための方法を追加しています。今日同じ状況に直面し、いくつかの方法を試し、使用questions.OrderBy(q => Guid.NewGuid()).ToList()し、さらにいくつかの提案をしました。後で、ビューモデルに新しいフィールドを追加し、ループでstring RandomOrder割り当て てから使用することを考えましたが、これはうまく機能しました。Guid.NewGuid().ToString()questions.OrderBy(i => i.RandomOrder).ToList()

shuffleAlways著者が評価の作成中にオプションを選択した場合、質問をシャッフルする必要がありました。そうでない場合は、通常の並べ替え順序で並べ替えます。完全な解決策は次のとおりです。

    private List<AssessmentQuestionsViewModel> LoadAllQuestions(string assessmentId, bool shuffleQuestions)
    {
        List<AssessmentQuestionsViewModel> questions = new List<AssessmentQuestionsViewModel>();

        var items = assessmentQuestionRepository.GetAll().Where(i => i.AssessmentId == assessmentId).ToList();

        foreach (var item in items)
        {
            questions.Add(new AssessmentQuestionsViewModel
            {
                Id = item.Id,
                AssessmentId = item.AssessmentId,
                QuestionText = item.QuestionText,
                HintText = item.HintText,
                QuestionType = item.QuestionType,
                MaxMarks = item.MaxMarks,
                SortOrder = item.SortOrder,
                RandomOrder = Guid.NewGuid().ToString(),
                Answers = LoadAllAnswers(item.Id)
            });
        }

        if (shuffleQuestions)
        {
            questions = questions.OrderBy(i => i.RandomOrder).ToList();
        }
        else
        {
            questions = questions.OrderBy(i => i.SortOrder).ToList();
        }

        return questions;
    }

そして、これは魅力のように機能しました。これが他の人に役立つことを願っています。

于 2016-06-24T06:31:46.423 に答える
-1

質問からランダムなデータを選択する方法としてORDERBYNEWID()を使用していると思いますか?その場合は、NEWID()(または同等のLINQ)の使用を避ける必要があります。これにより、テーブル内のすべてのレコードに対して大量の新しいGUIDが生成されます。大規模なデータセットでは、それは無駄になります。

代わりに、ランダムソートの最適化されたソリューションについては、ASP.NETで使用するLinq OrderbyrandomThreadSafeを参照してください。次に、テイク演算子とセットを追加するだけです。

Random random = new Random();
int seed = random.Next();

var RandomQuestions = Questions.OrderBy( s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed); 

return RandomQuestions.Take(6);
于 2012-07-23T08:17:29.043 に答える