0

我有一个数据库设置如下(不幸的是,不允许在此处发布图表图像,因此需要描述:响应表 - 包含 RespondentID、QuestionID、ResponseOptionID ResponseProperties - 包含 ResponsePropertyID、ResponsePropertyTypeID、名称 ResponsePropertyTypes - 包含 ResponsePropertyTypeID、名称

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

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

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

现在我需要从数据库中取回美国和 Wave2012 中的所有(而不是重复的)响应。诀窍是我需要的每个响应都必须在 Wave2012 和美国。我正在尝试使用 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
                            };
4

2 回答 2

0

澄清一下,您正在尝试使用 LINQ to SQL 而不是 EF 来执行此操作,因为它们对 MM 有相当不同的模型。使用 LINQ to SQL,您必须包含中间连接表。

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

于 2012-08-20T19:13:20.637 回答
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,
};

Response确实在美国和 Wave2012中产生了独特的 s。生成的 sql 将显示两个EXISTS谓词AND

于 2012-08-21T22:55:44.647 回答