Ручной (динамический) подзапрос LINQ с использованием предложения IN - PullRequest
2 голосов
/ 15 апреля 2010

Я хочу сделать запрос к БД с помощью LINQ-руководства по написанию SQL, мой метод linq:

var q = db.TableView.Where(sqlAfterWhere);
returnValue = q.Count();

этот метод хорошо запрашивает, передано ли значение переменной "sqlAfterWhere": (эта переменная имеет тип String)

it.Name = 'xyz'

но что, если я хочу использовать предложение IN, используя подзапрос. (мне нужно использовать 'it' перед каждым именем столбца в вышеприведенном запросе для работы), я не могу использовать 'it' перед столбцами подзапроса в качестве отдельного запроса, так что мне делать, если я не использую какую-либо вещь, и использование имен столбцов напрямую выдает ошибку, говорящую <ColumnName> could not be resolved, где <ColumnName> - это имена моих столбцов без 'it' в начале.

Итак, запрос не работает: (это строка, переданная в указанную выше переменную):

it.Name IN (SELECT Name FROM TableName WHERE Address LIKE '%SomeAddress%')

ошибки появляются как:

Имя не может быть разрешено
Адрес не может быть решена

Точная ошибка:

"" Имя "не может быть разрешено в текущей области или контексте. Убедитесь, что все переменные, на которые есть ссылки, находятся в области, что необходимые схемы загружены и что на пространства имен ссылаются правильно., Рядом с простым идентификатором, строка 6, столбец 25. "

Та же ошибка для "Адреса"

если я использую «это». перед этими столбцами выдает ошибку как:

"Тип элемента 'Edm.Int32' и CollectionType 'Transient.collection [Transient.rowtype (GroupID, Edm.Int32 (Nullable = True, DefaultValue =))]' несовместимы. Выражение IN поддерживает только сущность , примитивный и ссылочный типы., возле предиката WHERE, строка 6, столбец 14. "

1 Ответ

0 голосов
/ 08 ноября 2010

Предполагая, что TableName также находится в вашем контексте EF и возвращает тот же тип, что и TableView, вы должны иметь возможность сделать что-то вроде

var addresses = db.TableName.Where(x => x.Address.Contains("SomeAddress"));
var q = db.TableView.Intersects(address);
returnValue = q.Count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...