не понимаю это исключение - PullRequest
0 голосов
/ 18 апреля 2009

я использую linq to sql у меня есть миссия, которая содержит набор заданий. Допустим, я отправил запрос об общей продолжительности всех заданий за миссию.

и я написал следующий запрос:

return db.Missions.Select(m => new MissionNameDays()
    {
        Name = m.MissionName,
        Days = m.Assignments.Sum(a => a.Duration())
    });

продолжительность просто определяется как (для простоты)

public partial class Assignment
{
    public int Duration()
    {
        return 1;
    }
}

выполнение этого кода дает мне следующее исключение:

Может быть указано только одно выражение в списке выбора, когда подзапрос не представлен с EXISTS.
Описание: необработанное исключение произошло во время исполнения текущий веб-запрос. Пожалуйста, просмотрите трассировка стека для получения дополнительной информации о ошибка и откуда она возникла код.

Сведения об исключении: System.Data.SqlClient.SqlException: Можно указать только одно выражение в списке выбора, когда подзапрос не представлен с EXISTS.

я заметил, что если я опущу Duration () из запроса (он же

Days = m.Assignments.Sum(a => 1)

работает нормально
какие-либо идеи о причине этого?

1 Ответ

0 голосов
/ 18 апреля 2009

Свойство Duration не выражается в выражении SQL, поскольку оно не является свойством таблицы. Так как это метод в Назначениях, синтаксический анализатор выражений не может правильно превратить его в допустимое выражение SQL. Предположительно в таблице назначений есть какой-то столбец, из которого будет рассчитываться продолжительность. Попробуйте использовать то же выражение, которое вы использовали для вычисления Duration в вашем выражении Select.

return db.Missions.Select(m => new MissionNameDays()
    {
        Name = m.MissionName,
        Days = m.Assignments.Sum(a => a.LengthInMinutes / 1440 )
    });

В качестве альтернативы, вы можете завершить запрос, а затем выполнить выбор, используя LINQToObjects, который будет работать с неколоночными свойствами / методами. Поскольку вы не фильтруете Миссии в этом запросе, я думаю, я бы выбрал этот метод.

return db.Missions.ToList().Select(m => new MissionNameDays()
    {
        Name = m.MissionName,
        Days = m.Assignments.Sum(a => a.Duration())
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...