c# - Linq从一个表中选择数据而不是在另一个表中

标签 c# asp.net-mvc-3 linq

您好,我有以下代码可以从一个表中选择数据,而不是在其他表中

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 也是如此出色地。在您的代码中,result1result2 现在是两个列表,一个包含 >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/

相关文章:

c# - LINQ执行流程(作业)

c# - Windows 手机 REST API

javascript - 如何防止 Kendo Grid 中输入相同的值

entity-framework - Entity Framework 、DbSet<T>、Dispose() 性能问题

c# - LINQ - 获取列表中列表中的所有项目?

jquery - 调用 jQuery 将不起作用

c# - 多线程代码使 Rhino Mocks 导致死锁

c# - 在远程机器上执行exe

c# - Visual Studio 发布 Web 部署出现 ERROR_USER_NOT_ADMIN 错误

asp.net-mvc-3 - ASP.Net MVC 3 中的全局化