1

我在我的 edmx 文件中映射了以下实体,该文件是我数据库中表的镜像:

我只对特定人的问卷感兴趣。

我如何构建一个查询,它只会为一个人带回一份问卷,以便我仍然可以自然地遍历它,如下所示:

问卷调查问卷.问卷调查部分.问卷调查字段.问卷调查数据

问卷
id
名称
order_position
其他属性

问卷
_部分 ID
名称订单_位置 其他属性 问卷
_fk


问卷
_字段 ID
名称
order_position
其他属性
问卷_fk
section_fk

问卷
_数据 id

其他属性
field_fk
问卷_fk
section_fk
person_pk

个人
ID
名称
field_fk

每个问卷有许多问卷调查
每个问卷调查部分有许多问卷
调查字段 每个问卷调查字段在问卷数据实体中有许多条目,但每个人、字段、部分和问卷只有一个条目

使用我的导航属性,我可以像这样导航:问卷调查.questionnaire_section.questionnaire_field.questionnaire_data

我只对特定人的问卷感兴趣。

如何构建一个只会为一个人带回 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 回答