首先,你能否用整个方法更新你的问题,以便我们看到ViewBag
会发生什么?因为你的代码应该工作得很好,所以为ViewBag分配任何值通常都是没有问题的:
ViewBag.property1 = 0;
ViewBag.property1 = "zero";
工作得很好。 ViewBag
是动态的。现在,如果您稍后尝试将ViewBag.ddlUserId
分配给实际为错误类型的东西,则可能会出现该错误。
我想你也重写你的陈述,让我解释一下为什么。假设您的db.Users
中有很多(> 100.000)User
记录,并且我们假设Fi
也是如此。在您的代码中,result1
和result2
现在是两个列表,其中一个包含> 100.000 User
对象,另一个包含100.000 Fi
个对象。然后将这两个列表进行比较以产生一个字符串列表。现在想象一下你的Web服务器处理这个所需的资源。假设你实际使用/访问单独的SQL服务器来检索你的数据,让这个服务器完成这项工作,比如产生UserID列表,会更好更快。 对于你要么使用基里尔Bestemyanov的答案或以下:
var list = (from user in db.Users
where !db.Fi.Any(f => f.UserID == user.UserID)
select user.UserName).ToList()
这将产生SQL服务器只是一个查询来执行:
SELECT
[Extent1].[UserName] AS [UserName]
FROM [dbo].[Users] AS [Extent1]
WHERE NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Fi] AS [Extent2]
WHERE [Extent2].[UserID] = [Extent1].[UserID]
)}
这到底是你想要什么...
只是为了澄清更多:
var list = (from user in db.Users
where !db.Fi.Any(f => f.UserID == user.UserID)
select user.UserName).ToList()
可以写成以下lambda表达式,以及:
var list = db.Users.Where(user => !db.Fi.Any(f => f.UserID == user.UserID))
.Select(user => user.UserName).ToList()
从它的外观是由基里尔Bestemyanov的回答略有不同(我略作修改,只是为了让它看起来更加类似):
var list = db.Users.Where(user => !db.Fi.Select(f => f.UserID)
.Contains(user.UserID))
.Select(user => user.UserName).ToList();
但是,它们实际上会产生相同的SQL语句,因此也是相同的列表。
检查'ddlUserId'的数据类型,可能与字符串不匹配! – zey 2013-04-27 05:40:01
看起来像ViewBag.ddlUserId期望一个IEnumerable的User对象。但查询的结果是字符串列表 – 2013-04-27 06:52:35
我认为管理员用户是一个枚举。 – Amit 2013-04-27 07:07:10