Miz*_*lla 9 c# linq asp.net-mvc-3
您好我有以下代码从一个表中选择数据而不是在其他表中
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;
Run Code Online (Sandbox Code Playgroud)
我在listString中获得了值.但是在向viewbag添加listString时出错了.
Unable to cast object of type 'System.Collections.Generic.List`1[System.String]' to type 'System.Collections.Generic.IEnumerable`1[Main.Models.Admin.User]'.
Run Code Online (Sandbox Code Playgroud)
Maj*_*yte 25
首先,您是否可以使用整个方法更新您的问题,以便我们可以看到可能会发生什么ViewBag?因为您的代码应该可以正常工作,所以为ViewBag分配任何值通常都没问题:
ViewBag.property1 = 0;
ViewBag.property1 = "zero";
Run Code Online (Sandbox Code Playgroud)
工作得很好.ViewBag是动态的.现在,如果你以后试图解决ViewBag.ddlUserId实际上错误的类型,你可能会得到那个错误.
我希望你也重写你的陈述,让我解释一下原因.假设您有很多(> 100.000)User记录db.Users ,我们也假设相同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()
Run Code Online (Sandbox Code Playgroud)
这将只生成一个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]
)}
Run Code Online (Sandbox Code Playgroud)
这到底是你想要的......
只是为了澄清更多:
var list = (from user in db.Users
where !db.Fi.Any(f => f.UserID == user.UserID)
select user.UserName).ToList()
Run Code Online (Sandbox Code Playgroud)
也可以写成以下lambda表达式:
var list = db.Users.Where(user => !db.Fi.Any(f => f.UserID == user.UserID))
.Select(user => user.UserName).ToList()
Run Code Online (Sandbox Code Playgroud)
从它的外观看起来与Kirill Bestemyanov的答案略有不同(我稍作修改,只是为了让它看起来更相似):
var list = db.Users.Where(user => !db.Fi.Select(f => f.UserID)
.Contains(user.UserID))
.Select(user => user.UserName).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,它们实际上会生成相同的SQL语句,因此列表相同.
我将其重写为 linq 扩展方法:
List<string> listString = db.Users.Where(e=>!db.Fi.Select(m=>m.UserID)
.Contains(e.UserID))
.Select(e=>e.UserName).ToList();
Run Code Online (Sandbox Code Playgroud)
试试吧,它应该工作。
小智 6
试试这个很简单。
var result=(from e in db.Users
select e.UserID).Except(from m in db.Fi
select m.UserID).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34848 次 |
| 最近记录: |