Конвертировать sql Linq

 Select Curso.* from Curso left join AlumnoCurso on Curso.id = AlumnoCurso.Curso_id where AlumnoCurso.Curso_id is null

Друзья у меня эта Консультация есть, но мне не удалось знать, как перемещать ее в linq, или они помогают expression lambda пожалуйста?

в момент у меня есть это, так как, использовав два типа взаимодействия dbContext, я производился ошибка, сейчас я это делаю, но он не приносит мне данных.

cursos = ctx.Curso.ToList();

                    var Query = from curso in cursos
                                 join alumno in ctx.AlumnoCurso on curso.id equals alumno.Curso_id into g
                                 where g.DefaultIfEmpty() == null
                                 select curso;
                    cursos = Query.ToList();

мне удалось сделать это, но с Expression lambda возможное решение есть с LINQ?

 var cursos_tomados = ctx.AlumnoCurso.Where(x => x.Alumno_id == Alumno_id)
                                                        .Select(x => x.Curso_id)
                                                        .ToList();
                    cursos = ctx.Curso.Where(x => !cursos_tomados.Contains(x.id)).ToList();          
1
задан 26.07.2016, 20:11
3 ответа

AГ±ado один mГ©todo тренажер для грудной клетки для LeftsJoins в LinQ, и примере как использовать это, если он стоит кому-то:

public static IEnumerable<TResult> 
    LeftJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
                                                  IEnumerable<TInner> inner, 
                                                  Func<TSource, TKey> pk, 
                                                  Func<TInner, TKey> fk, 
                                                  Func<TSource, TInner, TResult> result)
{
    IEnumerable<TResult> _result = Enumerable.Empty<TResult>();

    _result = from s in source
          join i in inner
          on pk(s) equals fk(i) into joinData
          from left in joinData.DefaultIfEmpty()
          select result(s, left);

    return _result;
}  



var resultJoint = Person.BuiltPersons().LeftJoin(                    /// Source Collection
                    Address.BuiltAddresses(),                        /// Inner Collection
                    p => p.IdAddress,                                /// PK
                    a => a.IdAddress,                                /// FK
                    (p, a) => new { MyPerson = p, MyAddress = a })   /// Result Collection
                .Select(a => new
                {
                    Name             = a.MyPerson.Name,
                    Age              = a.MyPerson.Age,
                    PersonIdAddress  = a.MyPerson.IdAddress,
                    AddressIdAddress = (a.MyAddress != null ? a.MyAddress.IdAddress : -1),
                    Street           = (a.MyAddress != null ? a.MyAddress.Street    : "Null-Value")
                }); 
1
ответ дан 24.11.2019, 13:46

Ты можешь пытаться повторно писать код с lambdas в код без lambdas (:

Не совершай ошибку утверждения, что присутствие lambdas подразумевает отсутствие выражений LINQ. Помни, что методы расширения Select, Where, между другими, они - все исходи из LINQ; большая деталь состоит в том, что в случае могут использоваться эти методы в стиле, похожем на SQL и в другом случае они используются как вызов в водопаде различных методов расширения. Любой, который был бы случаем, код MSIL, произведенный, составив, - практически тот же самый, который выражает как вызов в водопаде различных методов расширения.

Принимая как базовый код LINQ с lambdas, в как дела в вопросе:

var cursos_tomados = ctx.AlumnoCurso.Where(x => x.Alumno_id == ((Alumno_id)))
                      .Select(x => x.Curso_id)
                      .ToList();
cursos = ctx.Curso.Where(x => !cursos_tomados.Contains(x.id)).ToList();

Как будь написан, Alumno_id (между двойными скобками) это переменная, стоимость которой заблаговременно определена. Это не оценивается в консультации первоначальном SQL: возможно прошли с тобой по высоте?

Как я вижу, цель первая получать все они пойдите курсов, что Alumno_id он имеет распределенный. Потом, получать все курсы, что Alumno_id он не имеет распределенные (посредством вычитания наборов).

Из-за того, что оно это помещает более понятным способом, что желается: ввиду одного Alumno_id соответствующий одному Alumno, получать все Cursos что не распределены этому ученику. Если цель, к которой ты стремишься, не тот, которого я описал до настоящего времени, оставь комментарий, чтобы знать более точно, что тебе хочет удасться.

Первая инструкция выражения предыдущего LINQ может повторно писаться как:

var cursosTomadosIds = (from cursoTomado in ctx.AlumnoCurso
                       where cursoTomado.Alumno_id == Alumno_id
                       select cursoTomado.Curso_id).ToList();

И вторая инструкция может повторно писаться как:

var cursosNoTomados = (from curso in ctx.Curso
                      where !cursosTomadosIds.Contains(curso.id)).ToList();

Ты можешь сочетать оба выражения LINQ с помощью инструкции let:

var cursosNoTomados = (from curso in ctx.Curso
                      let cursosTomadosIds = (from cursoTomado in ctx.AlumnoCurso
                                             where cursoTomado.Alumno_id == Alumno_id
                                             select cursoTomado.Curso_id).ToList()
                      where !cursosTomadosIds.Contains(curso.id)).ToList();

В этом особенном случае, комбинированное выражение гораздо менее работоспособное, чем выражения по отдельности, так как выражение let она пере-оценена для каждого ввода перечисления, произведенного кодом LINQ. Я рекомендую тебя не используй выражение комбинированного LINQ.

Один left join также функционируй. Ты можешь определять это как:

var query = from curso in ctx.Curso
            join alumnoCurso in (from ac in ctx.AlumnoCurso
                                 where ac.Alumno_id == ((Alumno_id))
                                 select ac)
                             on curso.id equals alumnoCurso.Curso_id into g
            where !g.Any()
            select curso;

Заметь присутствие суб-консультации, которую он содержит ((Alumno_id)) в предыдущем коде. Alumno_id (между двойными скобками) должен будь быть переменной, стоимость которой заблаговременно определена.

Любая интрига: не сомневайся в том, чтобы оставлять комментарий!

1
ответ дан 24.11.2019, 13:46

В linq смоги осуществлять left join

CГіmo: Реализовывать операции combinaciГіn левая приходящая ученица

могла бы быть чем-то как это

 var query = from curso in dbcontext.Curso
            join alumno in dbcontext.AlumnoCurso on curso.id equals alumno.Curso_id into g
            where g.DefaultIfEmpty() == null
            select curso;
0
ответ дан 24.11.2019, 13:46
  • 1
    Леандро, у Меня выходит эта ошибка ему не удалось понять это очень хорошо, Informaci и # 243; n добавочный: Cannot сравнил elements of type и #39; System. Collections. Generic. IEnumerable '1 [[Model. AlumnoCurso, Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] и #39;. Only primitive types, enumeration types and entity types пахал supported. – Kmiilo Berrio Montoya 26.07.2016, 19:16
  • 2
    если ты используешь EF, промежуточная таблица в связи многие не берет за образец многим, только у тебя должен бы быть организации Курс и Ученик, промежуточная таблица не была бы должна быть в твоей модели, так как эта отражается в свойствах списка в организациях. Или же у организации Курс будет свойство List< Alumno> и он будет иметь по отношению к организации Ученик свойство List< Curso> – Leandro Tuttini 26.07.2016, 19:29
  • 3
    Но быть должным и # 237; чтобы моделировать ей, так как есть несколько учеников с различными распределенными курсами, и echo окончательные замечания этих я изучаю, равный связь многих я имею по отношению ко многим эту промежуточную таблицу и костлявую каждую курс и ученик поверьте ICollection< AlumnoCurso> AlumnoCurso, искал ошибку и меня вытекали немного относящимся, с которым контекст данных, который не pod и # 237; когда два раза используют. – Kmiilo Berrio Montoya 26.07.2016, 19:43
  • 4
    в организации AlumnoCurso ты определяешь данные? ты мог бы издавать вопрос и помещать код linq, который ты выполняешь – Leandro Tuttini 26.07.2016, 19:55
  • 5
    Уже ему удайтесь сделать это, но я хотел бы возможный soluci и # 243; n с linq я это сделал с expression lambda – Kmiilo Berrio Montoya 26.07.2016, 20:09