在LINQ中使用Where方法的问题

时间:2011-11-24 07:54:00

标签: c# linq lambda

考虑这行代码:

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来区分列表,其中值在这里引用我之前列表的transactionid。现在我有一个错误消息,如 本地序列不能用于查询运算符的LINQ to SQL实现,除了Contains()运算符。

抱歉,我是lambda表达的新手。急需帮助

2 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西

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>并且具有恒定时间查找的内容中。

答案 1 :(得分:0)

好吧,您似乎正在尝试在SIDB_TransactionInformationsSIDB.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();