繁体   English   中英

我如何编写带有内部联接的Linq2Entities查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM