Как я могу написать Linq2Entities Query с внутренними объединениями - PullRequest
1 голос
/ 19 ноября 2009

Как я могу получить данные от этих связанных лиц. Я хочу получить только эти столбцы: 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

Примечание. Извините, я не могу вставить эту фотографию в свой пост, потому что система не позволяет мне этого делать.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2009

Если вы правильно настроили свои отношения, это довольно просто:

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
0 голосов
/ 20 ноября 2009

Я нашел решение для предложения 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...