我有一个数据库设置如下(不幸的是不允许在这里发布图表图像所以需要描述: 响应表 - 包含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
};
答案 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}}谓词。