您好,我有以下代码可以从一个表中选择数据,而不是在其他表中
var result1 = (from e in db.Users
select e).ToList();
var result2 = (from e in db.Fi
select e).ToList();
List<string> listString = (from e in result1
where !(from m in result2
select m.UserID).Contains(e.UserID)
select e.UserName).ToList();
ViewBag.ddlUserId = listString;
正在获取 listString 中的值。但是在将 listString 添加到 viewbag 时出错。
Unable to cast object of type 'System.Collections.Generic.List`1[System.String]' to type 'System.Collections.Generic.IEnumerable`1[Main.Models.Admin.User]'.
最佳答案
首先,您能否用整个方法更新您的问题,以便我们可以看到 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 列表。
为此,您可以使用 Kirill 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()
从外观上看,它与 Kirill Bestemyanov 的回答略有不同(我稍微修改了一下,只是为了让它看起来更相似):
var list = db.Users.Where(user => !db.Fi.Select(f => f.UserID)
.Contains(user.UserID))
.Select(user => user.UserName).ToList();
但是,它们实际上会产生相同的 SQL 语句,因此产生相同的列表。
关于c# - Linq从一个表中选择数据而不是在另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16248189/