1

DB 内のテーブルのミラーである edmx ファイルに次のエンティティをマップしています

。 特定の人物のアンケートにのみ関心があります。

次のように自然に繰り返すことができるように、1 人に対して 1 つのアンケートのみを返すクエリを作成するにはどうすればよいですか。

question.questionnaire_section.questionnaire_field.questionnaire_data

アンケート
ID
名前
order_position
その他のプロパティ

question_section
id
name
order_position
その他のプロパティ
question_fk

question_field
id
name
order_position
その他のプロパティ
question_fk
section_fk

question_data
id

その他のプロパティ
field_fk
survey_fk
section_fk
person_pk

個人
ID

field_fk

アンケートには多くのアンケート
セクションがあります 各アンケートセクションには多くのアンケート
フィールドがあります 各アンケートフィールドにはアンケートデータ エンティティに多くのエントリがありますが、個人、フィールド、セクション、アンケートごとに 1 つのエントリしかありません

ナビゲーション プロパティを使用して、次のようにナビゲートできます。

特定の人へのアンケートにのみ関心があります。

次のように反復できるように、1 人に対して 1 つのアンケートのみを返すクエリを作成するにはどうすればよいですか。

IQueryable<questionnaire> queryResult = from q in _db.questionnaires
                                        where q.id == 1 //only intrested in 1 questionnaire
                                        select q;

foreach (questionnaire myQuestionnaire in queryResult)
{
    Console.WriteLine(myQuestionnaire.name);
    foreach (questionnaire_section mySection in myQuestionnaire.questionnaire_section)
    {
        Console.WriteLine(mySection.name);
        foreach (questionnaire_field myField in mySection.questionnaire_field)
        {
            Console.WriteLine(myField.name);
            foreach (questionnaire_data myData in myField.questionnaire_data)
            {                                    
                // here I will get the data for all people                      
                Console.WriteLine(myData.value); 

                // I am only intrested in the data for 1 person
                // so I could do this:

                if (myData.person_fk == 1) 
                // I dont want to bring all the questionnaire_data for each person back from the db.
                {
                    Console.WriteLine(myData.value);
                    // I'm only interested in the questionnaire_data for a single person
                }
             }           
         }
     }       
}
4

1 に答える 1

0
namespace TestProject
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {

            IQueryable<questionnaireWithFieldWithData> results = staging_dbEntities();

            foreach (var item in results)
            {
                Debug.WriteLine(item.questionnaire_section.name.Trim());                            //section name
                foreach (var sectionWithDataitem in item.questionnaire_fieldWithData)
                {
                    Debug.Write(sectionWithDataitem.questionnaire_field.fld_caption.Trim() + ": ");         //field caption

                    if (sectionWithDataitem.questionnaire_data.field_value != null)
                    {
                        Debug.WriteLine(sectionWithDataitem.questionnaire_data.field_value.Trim());         //field value
                    }
                    else
                    {
                        Debug.WriteLine("");
                    }
                }
            }

        }

        public IQueryable<questionnaireWithFieldWithData> epm_staging_dbEntities()
        {
            staging_dbEntities _db = new staging_dbEntities(); 

            var questionnaire_field1 = _db.questionnaire_field;

            var result = from s in _db.questionnaire_section
                         where s.questionnaire_fk == 1
                         select new questionnaireWithFieldWithData()
                         {
                             questionnaire_section = s,
                             questionnaire_fieldWithData = from f in _db.questionnaire_field
                                                           where f.questionnaire_fk == s.questionnaire_fk 
                                                           where f.section_fk == s.id

                                                           select new questionnaireFieldWithData()
                                                           {
                                                               questionnaire_field = f,
                                                               questionnaire_data = f.questionnaire_data.Where(d => d.person_fk == 1).FirstOrDefault()
                                                           }
                         };

            return result;
        }

        public class questionnaireFieldWithData
        {
            public questionnaire_field questionnaire_field;
            public questionnaire_data questionnaire_data;
        }

        public class questionnaireWithFieldWithData 
        { 
            public questionnaire_section questionnaire_section;
            public IQueryable<questionnaireFieldWithData> questionnaire_fieldWithData;      
        }
    }
}
于 2012-09-21T14:51:09.317 に答える