LINQ to SQL опускает поле из результатов, в то же время включая его в предложение where - PullRequest
0 голосов
/ 12 сентября 2011

В основном я пытаюсь сделать это в LINQ to SQL;

SELECT DISTINCT a,b,c FROM table WHERE z=35

Я пробовал это, (код C #)

(from record in db.table
select new table {
    a = record.a,
    b = record.b,
    c = record.c
}).Where(record => record.z.Equals(35)).Distinct();

Но когда я таким образом удаляю столбец z из объекта таблицы, я получаю следующее исключение:

Ошибка привязки: элемент "table.z" не найден в проекции.

Я не могу вернуть поле z, потому что оно сделает мой отчетливый бесполезным. Любая помощь приветствуется, спасибо.

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

Это более полный пример, который включает использование PredicateBuilder,

var clause = PredicateBuilder.False<User>();
clause = clause.Or(user => user.z.Equals(35));
foreach (int i in IntegerList) {
    int tmp = i;
    clause = clause.Or(user => user.a.Equals(tmp));
}

var results = (from u in db.Users
               select new User {
                   a = user.a,
                   b = user.b,
                   c = user.c
               }).Where(clause).Distinct();

Редактировать2:

Большое спасибо всем за комментарии и ответы, это решение, которое я выбрал,

var clause = PredicateBuilder.False<User>();
clause = clause.Or(user => user.z.Equals(35));
foreach (int i in IntegerList) {
    int tmp = i;
    clause = clause.Or(user => user.a.Equals(tmp));
}

var results = (from u in db.Users
               select u)
               .Where(clause)
               .Select(u => new User {
                   a = user.a,
                   b = user.b,
                   c = user.c
               }).Distinct();

Очень важно упорядочить «Где» и «Выбрать».

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

проблема существует, потому что предложение where находится вне запроса linq, и вы применяете предложение where к новому анонимному типу данных, который вызывает ошибку

Предложите вам изменить свой запрос на

(from record in db.table
where record.z == 35
select new table {
    a = record.a,
    b = record.b,
    c = record.c
}).Distinct();
2 голосов
/ 12 сентября 2011

Разве вы не можете просто поместить предложение WHERE в LINQ?

(from record in db.table
where record.z == 35
select new table {
    a = record.a,
    b = record.b,
    c = record.c
}).Distinct();

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

.Выберите (r => new {a = r.a, b = r.b, c = r.c}). Distinct ();

Как показано здесь LINQ Select Distinct с анонимными типами , этот метод будет работать, так как он сравнивает все открытые свойства анонимных типов.

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

0 голосов
/ 12 сентября 2011

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, имеет.

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