[英]How can i write Linq2Entities Query with inner joins
我如何从这些相关实体获取数据。 我只想获取这些列:Term.Name,相关的Concept_Term.Weight,相关的Concept.Id
我写了SQL,但我不想使用
select t.Name,ct.ConceptId,ct.Weight from Term t
inner join Concept_Term ct on t.Id=ct.TermId
inner join Concept c on c.Id=ct.ConceptId
where c.Id == 80298 and t.LanguageId=2
我想看到的是与控制台应用程序中的表相同的结果,与我在SQL中编写的结果相同。
实体图片: http : //img7.imageshack.us/img7/7129/77365088.jpg
注意:抱歉,我无法将此照片嵌入我的帖子中,因为系统不允许我这样做。
如果您已经正确建立了关系,这很简单:
from t in db.Terms
where t.LanguageId == 2 // Do this early on for perf
from ct in t.ConceptTerms // This is the reverse FK: ct.TermId -> t.Id
where ct.Concept.Id == 80298 // This is the other FK: ct.ConceptId -> c.Id
select new {
t.Name, ct.ConceptId, ct.Weight
};
此代码假定您已将外键设置为可以双向使用。
它还表明您有一些冗余。 代替加入:
where ct.Concept.Id == 80298
我们可以直接进行检查:
where ct.ConceptId == 80298
我找到了一个针对SQL In子句的解决方案,我可以从此处获取并实现它。
int[] conceptIdList = (from ct in db.Concept_Term
where ct.TermId == termId
select ct.ConceptId
).ToArray();
var result = db.Concept_Term
.Where(LinqExt.BuildOrExpression<Concept_Term, int>(ct => ct.ConceptId, conceptIdList))
.Select(ct => ct.Term.Name };
代码用于实现SQL IN(x,y,z)子句:
public static Expression<Func<TElement, bool>> BuildOrExpression<TElement, TValue>(
Expression<Func<TElement, TValue>> valueSelector,
IEnumerable<TValue> values
)
{
if (null == valueSelector)
throw new ArgumentNullException("valueSelector");
if (null == values)
throw new ArgumentNullException("values");
ParameterExpression p = valueSelector.Parameters.Single();
if (!values.Any())
return e => false;
var equals = values.Select(value =>
(Expression)Expression.Equal(
valueSelector.Body,
Expression.Constant(
value,
typeof(TValue)
)
)
);
var body = equals.Aggregate<Expression>(
(accumulate, equal) => Expression.Or(accumulate, equal)
);
return Expression.Lambda<Func<TElement, bool>>(body, p);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.