SELECT DISTINCT a,b,c FROM table WHERE z=35
Важно отметить, что хотя SQL-выражение появляется после предложения SELECT …
, оно логическидолжны быть выполнены до SELECT
: сначала вы фильтруете ненужные записи (указав условие в предложении WHERE
), затем вы спроектируйте (SELECT
) оставшиеся записи, выбрав из него определенные атрибуты.
(Аналогичным образом DISTINCT
не может быть фактически выполнен до самого конца, когда все записи результатовдоступно, но оно стоит в начале запроса.)
Теперь давайте посмотрим на ваш запрос LINQ (который я немного сократил и переформатировал):
(from … in … select …).Where(…).Distinct();
Из вышеприведенного объяснения вы можете легко увидеть, что вы перевели ваш SQL-запрос в C # слишком буквально и, таким образом, ошибочно упорядочили Select
и Where
.Попробуйте изменить ситуацию, и все может получиться лучше:
(from record in db.table
where record.z == 35
select new table { a = record.a, b = record.b, c = record.c })
.Distinct();
Это (в большей степени, чем соответствующий SQL-запрос) точно отражает порядок, в котором отдельные операторы Where
, Select
и Distinct
будет фактически выполнено.
PS: Последний бит моего ответа предполагает, что db.table
не является коллекцией вашего типа table
.Из того, что вы спросили, видно, что table
не имеет свойства z
, в то время как тип, лежащий в основе коллекции db.table
, имеет.