Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq从一个表中选择数据,而不是从另一个表中选择数据_C#_Asp.net Mvc 3_Linq - Fatal编程技术网

C# Linq从一个表中选择数据,而不是从另一个表中选择数据

C# Linq从一个表中选择数据,而不是从另一个表中选择数据,c#,asp.net-mvc-3,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 !(f

嗨,我有以下代码从一个表中选择数据,而不是在另一个表中

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;

我将把它重写为linq扩展方法:

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

试试看,它应该会起作用。

首先,你能用整个方法更新你的问题吗,这样我们就可以看到
视图包的情况了?因为代码应该可以正常工作,所以将任何值指定给ViewBag通常都没有问题:

    ViewBag.property1 = 0;
    ViewBag.property1 = "zero";
很好用<代码>视图包
是动态的。现在,如果您稍后尝试将
ViewBag.ddlUserId
分配到实际上是错误类型的内容,则可能会出现该错误

我希望你也重写你的声明,让我解释一下原因。假设您的
db.Users
中有大量(>100.000)的
User
记录,我们对
Fi
也有同样的假设。在您的代码中,
result1
result2
现在是两个列表,一个包含>100.000
User
对象,另一个包含>100.000
Fi
对象。然后将这两个列表相互比较以生成字符串列表。现在想象一下web服务器处理此问题所需的资源。假设您实际使用/访问一个单独的SQL server从中检索数据,那么让该服务器来完成这项工作会更好更快,也就是生成用户ID列表。 为此,您可以使用Kirill Bestemyanov的答案或以下内容:

    var list = (from user in db.Users
                where !db.Fi.Any(f => f.UserID == user.UserID)
                select user.UserName).ToList()
这将只为SQL server生成一个要执行的查询:

    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的答案略有不同(我稍微修改了一下,只是为了让它看起来更相似):


但是,它们实际上会生成相同的SQL语句,从而生成相同的列表。

试试这个,它非常简单

var result=(from e in db.Users
            select e.UserID).Except(from m in db.Fi
                                    select m.UserID).ToList();
在T-SQL中,这意味着:

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

检查
ddlUserId
的数据类型,可能与字符串不匹配!看起来ViewBag.ddlUserId需要用户对象的IEnumerable。但是查询的结果是一个字符串列表。我认为管理员用户是一个枚举。我担心这会生成一系列SQL调用,但它将其转换为正确的SQL。谢谢!
var result=(from e in db.Users
            select e.UserID).Except(from m in db.Fi
                                    select m.UserID).ToList();
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));
SELECT * FROM tbl_Ware WHERE id IN (SELECT ware_ID, tbl_Buy WHErE tbl_Ware.title LIKE '% mtrTxtwareTitle.Text %')