查询与LinqToSQL的多对多关系

时间:2012-08-20 15:38:56

标签: linq-to-sql entity-framework-4.1 many-to-many

我有一个数据库设置如下(不幸的是不允许在这里发布图表图像所以需要描述: 响应表 - 包含RespondentID,QuestionID,ResponseOptionID ResponseProperties - 包含ResponsePropertyID,ResponsePropertyTypeID,Name ResponsePropertyTypes - 包含ResponsePropertyTypeID,Name

ResponsesInProperties(多对多表) - 包含ResponseID,ResponsePropertyID

ResponsesInProperties表上存在多对多的关系。这个表当然不会在EF中显示。

假设我有两个响应属性类型“Country”和“Wave”以及相应的ResponeProperties“USA”,“UK”和“Wave2011”,“Wave2012”。

现在我需要从数据库中取回所有(而不是重复的)响应,这些响应将在美国和Wave2012中。诀窍是我需要的每个响应都必须在Wave2012和USA中。我试图用LINQ to SQL实现这一点。以下是Linq我想出的那样得到了我正确的记录,但它们出现了很多次不同的属性。限制属性不会给我任何记录......

任何帮助表示赞赏!

            var responses = from r in db.Responses
                            from rp in r.ResponseProperties
                            select new
                            {
                                RespondentID = r.RespondentID,
                                QuestionCode = r.Question.Code,
                                ResponseOptionCode = r.ResponseOption.Code,
                                ResponseOptionCodeName = r.ResponseOption.Text,
                                ResponsePropertyName = rp.Name,
                                ResponsePropertyTypeName = rp.ResponsePropertyType.Name
                            };

2 个答案:

答案 0 :(得分:0)

为了澄清,您正在尝试使用LINQ to SQL而不是EF,因为它们具有相当不同的M-M模型。使用LINQ to SQL,您必须包含中间连接表。

此时查询中缺少的关键是过滤器(Where)子句。您需要为连接的两侧指定它们以正确过滤结果。您指出当您提供过滤器时,您不会返回任何记录。您能否使用该过滤器澄清您的问题,因为它可能有助于解决您的潜在问题。

答案 1 :(得分:0)

您的查询无法生成唯一的响应,因为您还会获得ResponsePropertyName和ResponsePropertyTypeName,这将复制结果。

此实体框架查询 -

from r in db.Responses
where r.ResponseProperties.Any (rp => rp.Name == "USA")
where r.ResponseProperties.Any (rp => rp.Name == "Wave2012")
select new
{
    RespondentID = r.RespondentID,
    QuestionCode = r.Question.Code,
    ResponseOptionCode = r.ResponseOption.Code,
    ResponseOptionCodeName = r.ResponseOption.Text,
};

会生成美国和Wave2012中的唯一Response。生成的sql将显示两个带有EXISTS的{​​{1}}谓词。