【问题标题】:How can i write Linq2Entities Query with inner joins如何使用内部连接编写 Linq2Entities 查询
【发布时间】:2009-11-19 02:23:47
【问题描述】:

如何从这些相关实体获取数据。我只想获取这些列: 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

注意:抱歉,我无法在帖子中嵌入这张照片,因为系统不允许这样做。

【问题讨论】:

    标签: c# sql linq entity-framework linq-to-entities


    【解决方案1】:

    如果你已经正确建立了关系,这很简单:

    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
    

    【讨论】:

    • +1。这是正确的答案。在 LINQ to Entities 中使用 join 几乎是不对的。
    【解决方案2】:

    我找到了一个 SQL In 子句的解决方案,我从here 中获取并实现了它 效果很好……

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2017-11-16
      • 2021-04-11
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多