如何在此方案中执行连接查询

时间:2011-11-04 05:05:33

标签: c# linq asp.net-mvc-3 entity-framework-4

我有三张桌子A,B,C。有一个ID,名字,地址coulmns。 B是具有attributeID,aId,attributeName的通用表。其中,c是B.的详细信息表,其中包含列valueId,attributeId,aId Value。 情景是。假设A是特定实体表(比如学生)。仅包含基本列和值。其中B是实体学生的额外列。 (例如,学生可能已更改地址,可能有3个手机号码)

    Table: A
    Aid      Name                   Address1 
    std1     Student                MG Street
    std2     Employee               Royal Street

    Table : B
    attributeId    aID            Value
    att1           std1          Address2
    att2           std1          ChangedAddress   
    att3           std1          Mobile1
    att4           std1          Mobile2

Table :C
 ValueId  attributeId    aID            Value

val1      att1           std1          Stefen colony  
val2      att2           std1          ChangedTo:Laurds
val3      att3           std1          87879797979798
val4      att4           std1          544559797979798


Note :Same for Employee 

我想构建查询以获取std1中c的所有值以及表A中的值。但不知何故db结构是动态的,因此表A的coulmns存储为表B中的值,其中作为值对于存储在表C中的B属性。如何为此编写Linq查询?

2 个答案:

答案 0 :(得分:0)

您可以简单地将记录加在一起,如:

class Student
{
    public int Id { get;set;}
}

class StudentPropertyDefintion
{
    public int Id { get; set; }
    public int StudentId { get; set; }
    public string PropertyName { get; set; }
}

class StudentPropertyValue
{
    public int PropertyDefinitionId { get; set; }
    public string PropertyValue { get; set; }
}

class Context
{
    public ISet<Student> Students { get; set; }
    public ISet<StudentPropertyDefintion> PropertyDefinitions { get; set; }
    public ISet<StudentPropertyValue> PropertyValues { get; set; }
}

// and query that

  Context context = new Context();

        var studentWithPropertiesQuery = from student in context.Students
                                         join propertyDefinition in context.PropertyDefinitions
                                         on student.Id equals propertyDefinition.StudentId
                                         join propertyValue in context.PropertyValues
                                         on propertyDefinition.Id equals propertyValue.PropertyDefinitionId
                                         select new
                                         {
                                             propertyValue,
                                             propertyDefinition,
                                             student
                                         };

答案 1 :(得分:0)

您能否通过描述结果中所需的对象类型来帮助我们?

您想要IEnumerable<A>IEnumerable<A, IEnumerable<C>>吗? 如果你想要第一个,你想要A包含一个IEnumerable<C>或(更极端的东西)直接包含C中列出的属性,就像它们是A的正常属性一样吗?

编辑:抱歉,我的帖子格式不正确(我在这些论坛中仍然是新手)。现在应该更清楚了。