Проблема с использованием метода Where в LINQ - PullRequest
0 голосов
/ 24 ноября 2011

Рассмотрим эту строку кода:

List<SIDB_TransactionInformation> transaction = SIDB.SIDB_TransactionInformations
                    .Where(k => k.iscurrent == true & k.objectid == SIDB.func_GetObjectID("dbo.SIDB_Module")).ToList();

List<SIDB_Module> module = SIDB.SIDB_Modules
                    .Where(k => k.moduleid == transaction
                                                .Where(j => j.transactionid == k.moduleid)
                                                .SingleOrDefault().transactionid).ToList();

У меня есть 2 вызова метода where в другой коллекции. Сначала я различаю свой список с помощью iscurrent и objectid, после этого у меня есть другой вызов метода where (для SIDB_Modules), чтобы различать список с помощью moduleid, где в значениях указывается идентификатор транзакции из моего предыдущего списка. Теперь у меня появляется сообщение об ошибке, подобное этому Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains ().

извините, я новичок в лямбда-выражении. очень нужна помощь

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Я думаю, это то, что вы ищете

List<SIDB_Module> module = SIDB
    .SIDB_Modules
    .Where(k => transaction.Any(j => j.transactionid == k.moduleid))
    .ToList();

Составьте список SIDB_Modules, где есть транзакция, transactionid которой равна moduleid. У LINQ to Sql может быть проблема с Any, я не помню, если это так, вы можете переписать его с дополнительным шагом, подобным этому

var transactionIds = transaction.Select(j => j.transactionid);
List<SIDB_Module> module = SIDB
    .SIDB_Modules
    .Where(k => transactionIds.Contains(k.moduleid))
    .ToList();

Если производительность представляет собой проблему, вы можете рассмотреть возможность использования второго метода и помещения transactionIds во что-то, что реализует ISet<T> и имеет постоянный поиск по времени.

0 голосов
/ 24 ноября 2011

Похоже, вы пытаетесь объединиться между SIDB_TransactionInformations и SIDB.SIDB_Modules. Если это так, попробуйте

var objectID = SIDB.func_GetObjectID("dbo.SIDB_Module");

List<SIDB_Module> modules = (from module in SIDB.SIDB_Modules
  join transaction in SIDB.SIDB_TransactionInformations on module.moduleid equals transaction.transactionid
  where transaction.iscurrent && transaction.objectid == objectID
  select module).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...