1

私はこのコードを持っています:

var questionCategory = questionnaire.QuestionCategories
    .First(x => x.Type == (int)questionCategoryType);
return questionCategory.Questions.Select(x => new 
    {
       Id = x.Id,
       Text = x.Text,
    });

これを1つのステートメントに短縮する方法があるかどうか、つまり変数questionCategoryを作成しないようにする方法があるかどうかに興味があります。ExtesionメソッドまたはLINQソリューション、あるいはその両方を少し探しています:)。

4

5 に答える 5

1

それを行うのに最適な方法ではないかもしれませんが、次のように変数ストレージなしでコードを1行に簡単に簡略化できます。

return questionnaire.QuestionCategories.First(x => x.Type == (int)questionCategoryType)
                    .Questions.Select(x => new {Id = x.Id, Text = x.Text});
于 2012-08-18T15:41:15.433 に答える
1

このように、nullをonにチェックする必要はなくQuestionCategories、最終結果はSelectonQuestionsになります。したがって、を使用する必要はFirstなく、代わりにWhere:を使用します。

return questionnaire.QuestionCategories 
     .Where(x => x.Type == (int)questionCategoryType) 
     .SelectMany(c => c.Questions.Select(q => new
                                        {
                                            Id = q.Id,
                                            Text = q.Text
                                        }));
于 2012-08-18T15:42:01.127 に答える
1

シーケンスが空の場合、またはどの要素も述語に一致しない場合にInvalidOperationExceptionが発生しないように、 Firstの代わりにFirstOrDefaultを使用することをお勧めします。

また、最初のクエリの後でnullをチェックし、その状況のデフォルト値を指定する必要があります。これはあなたが求めたものではありませんが、より防御的です。

var questionCategory = questionnaire.QuestionCategories.FirstOrDefault(x => x.Type == (int)questionCategoryType);

return questionCategory != null
        ? questionCategory.Questions.Select(x => new 
                                                 {
                                                    Id = x.Id,
                                                    Text = x.Text,
                                                 })
        : someDefaultValue;                                                 
于 2012-08-18T15:51:25.087 に答える
0
return questionnaire.QuestionCategories.First(x => x.Type == (int)questionCategoryType)
            .Questions.Select(x => new { Id = x.Id, Text = x.Text, });

見つからないnull場合に戻りたい場合の:x.Type == (int)questionCategoryType

return questionnaire.QuestionCategories.FirstOrDefault(x => x.Type == (int)questionCategoryType)
            .Questions.Select(x => new { Id = x.Id, Text = x.Text, });
于 2012-08-18T15:39:03.883 に答える
0

を使用Firstすると、クエリが強制的に実行されます(のようなナビゲーションプロパティの列挙についても同じことが言えますquestionnaire.QuestionCategories)。これは、複数のクエリを発行しないようにするために回避する必要があります。

return from qc in dataContext.QuestionCategories
       where qc.QuestionaireID == questionnaire.ID //guessing names here
       where qc.Type == (int)questionCategoryType
       from q in qc.Questions
       select new 
    {
       Id = q.Id,
       Text = q.Text,
    };

これにより、単一のクエリが発行され、すべての作業がSQLServerにリモート処理されます。

于 2012-08-18T16:16:53.567 に答える