Linq从一个表中选择数据而不是在其他表中

时间:2013-04-27 04:00:27

标签: 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中获得了值。但是在将viewString添加到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]'.

4 个答案:

答案 0 :(得分:22)

首先,您是否可以使用整个方法更新您的问题,以便我们可以看到ViewBag可能会发生什么?因为您的代码应该可以正常工作,所以为ViewBag分配任何值通常都没有问题:

    ViewBag.property1 = 0;
    ViewBag.property1 = "zero";

工作得很好。 ViewBag是动态的。现在,如果您稍后尝试将ViewBag.ddlUserId分配给实际上是错误类型的内容,您可能会收到该错误。

我希望你也重写你的陈述,让我解释一下原因。假设您User中有db.Users条记录有很多(> 100.000),我们对Fi也假设相同。在您的代码中,result1result2现在是两个列表,一个包含&gt; 100.000 User个对象,另一个包含&gt; 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语句,因此列表相同。

答案 1 :(得分:4)

我会将其重写为linq扩展方法:

List<string> listString = db.Users.Where(e=>!db.Fi.Select(m=>m.UserID)
                                                  .Contains(e.UserID))
                                  .Select(e=>e.UserName).ToList();

尝试一下,它应该有用。

答案 2 :(得分:4)

试试这很简单。

var result=(from e in db.Users
            select e.UserID).Except(from m in db.Fi
                                    select m.UserID).ToList();

答案 3 :(得分:0)

var res = db.tbl_Ware.where(a => a.tbl_Buy.Where(c => c.tbl_Ware.Title.Contains(mtrTxtWareTitle.Text)).Select(b => b.Ware_ID).Contains(a.ID));

在T-SQL中,这意味着:

SELECT * FROM tbl_Ware WHERE id IN (SELECT ware_ID, tbl_Buy WHErE tbl_Ware.title LIKE '% mtrTxtwareTitle.Text %')