Выберите запись, где значение равно значению идентификатора - PullRequest
0 голосов
/ 12 марта 2020

Это простой, но сложный для описания вопрос

await dbContext.MyTable.AnyAsync(x => x.valueOne == valueOne && x.valueTwo == /*here's my problem*/ );

valueOne передается в качестве параметра. Конец утверждения в псевдокоде будет выглядеть следующим образом:

x.valueTwo == the valueTwo of valueOne's record

Я знаю, что могу извлечь запись ValueOne и сравнить оттуда, но это неуклюже, и я чувствую, что определенно есть лучший способ если бы я только мог найти это. Как я могу сделать это в одну строку?

Редактировать: уточнение

Чтобы уточнить, неуклюжий путь будет

var valueOneRecord = await dbContext.MyTable.FirstAsync(x => x.valueOne == valueOne);
exists = await dbContext.MyTable.AnyAsync(x => x.valueOne == valueOne && x.valueTwo == valueOneRecord.valueTwo);

Я пытаясь объединить это в одну строку вместо двух запросов к базе данных

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Довольно часто нам проще, если вы дадите нам свое требование вместо того, чтобы дать нам какой-то код и скажете, что код не работает.

Давайте предположим, что ваш неуклюжий метод - это то, что вам нужно.

Итак, MyTable - это последовательность объектов, давайте назовем их Values. Каждое значение имеет как минимум два свойства: ValueOne и ValueTwo. У вас также есть входное значение: valueOne.

Предположим, у вас были Школы и Студенты, у каждой Школы был первичный ключ в Id, а в штате

class School
{
    public int Id {get; set;}
    public int CityId {get; set;}
    ...
}

public class Student
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int CityId {get; set;}
}

Примечание, столь странный запрос: :

Дайте мне всех учеников, которые живут в том же городе, что и школа, 10

int schoolId = 10;
var studentsInSameCityAsSchool10 = dbContext.Schools

    // keep only school with Id == 10
    .Where(school => school.Id == 10)

    // get all Students on these Schools
    .GroupJoin(dbContext.Students,
        school => school.CityId,
        student => student.CityId,

        (school, studentsWithSameCityId) => new
        {
           SchoolId = school.Id,
           Students = studentsWithSameCityId.Select(student => new
           {
               StudentId = student.Id,
               Name = student.Name,
               ...
           })
           .ToList(),
        });

Очень просто, не правда ли. Теперь давайте сделаем запрос только в одной таблице:

Дайте мне все школы с тем же CityId, что и у школы [10]

int schoolId = 10;
var studentsInSameCityAsSchool10 = dbContext.Schools

    // keep only school with Id == 10
    .Where(school => school.Id == 10)

    // get all Students on these Schools
    .GroupJoin(dbContext.Students,
        school => school.CityId,
        student => student.CityId,

        (school, studentsWithSameCityId) => new
        {
           SchoolId = school.Id,
           Students = studentsWithSameCityId.Select(student => new
           {
               StudentId = student.Id,
               Name = student.Name,
               ...
           })
           .ToList(),
        });

Очень просто, не Это. Теперь давайте сделаем запрос только в одной таблице:

Дайте мне все школы с тем же CityId, что и School [10]

int schoolId = 10;
var studentsInSameCityAsSchool10 = dbContext.Schools

    // keep only school with Id == 10
    .Where(school => school.Id == 10)

    // get all Students on these Schools
    .Join(dbContext.Students,                 // Join Schools and Students
        school => school.CityId,              // from every School take the CityId
        student => student.CityId,            // from every Student take the CityId

        (school, studentWithSameCityId) => new  // from every School and every Student
        {                                       // that has the same CityId, make one new
            SchoolId = school.Id,
            CityId = school.CityId,
            StudentThatLiveInCityId = studentWithSameCityId,
        });

Очень просто, не Это? Теперь давайте сделаем запрос только в одной таблице:

Дайте мне все школы с тем же CityId, что и у школы [10]

int schoolId = 10;
var studentsInSameCityAsSchool10 = dbContext.Schools
    .Where(school => school.Id == 10)

    // get all Schools in the same City as School[10]
    .Join(dbContext.Schools,                 // Join Schools and Schools
        school1 => school1.CityId,           // from every School1 take the CityId
        school2 => school2.CityId,           // from every School2 take the CityId

        (school1, school2WithSameCityId) => new  // from every School and every School
        {                                        // that has the same CityId, make one new
           ...
        });

Но что это связано с моим вопросом

Теперь давайте изменим некоторые имена свойств:

class School
{
    public int ValueOne {get; set;}  // was Id
    public int ValueTwo {get; set;}  // was CityId
}

int valueOne = 10; // was schoolId

Дайте мне все школы с одинаковым значением ValueTwo (было: расположено в том же городе или имеет тот же cityId), что и школа с ValueOne == valueOne (был: как школа [10])

После упражнений со школами и учащимися это должно быть легко:

int valueOne = 10;
var valuesWithSameValueTwo = dbContext.Schools
    .Where(value => value.ValueOne == 10)

    // get all Values with same ValueTwo Value[10]
    .Join(dbContext.Schools,             // Join Schools and Schools
        val1 => val1.ValueTwo,           // from every val1 take the ValueTwo
        val2 => val2.ValueTwo,           // from every val2 take the ValueTwo

        (val, valWithSameValueTwoId) => new
        { 
          ...
        });

Что ж, ваш запрос проще: вам нужно только знать, есть ли такой элемент. Таким образом, вам не нужно выбирать какие-либо свойства, и вы можете остановиться, как только найдете их:

 // Where and Join:
 ...
 (val, valWithSameValueTwoId) => valWithSameTwoId)

 .Any();
0 голосов
/ 12 марта 2020

Пожалуйста, попробуйте ниже

        dbContext.MyTable.Join(dbContext.MyTable,
            x => new {
                x.valueOne,
                valueTwo = x.valueOne
            },
            y => new {
                y.valueOne,
                y.valueTwo
            },
            (x, y) => new
            {
                record1_valueOne = x.valueOne,
                record1_valueTwo = x.valueTwo,
                record2_valueOne = y.valueOne,
                record2_valueTwo = y.valueTwo,
            }).Where(x => x.record1_valueOne == valueOneParam && x.record2_valueOne == valueOneParam);
...