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.000User
对象,另一个包含>100.000Fi
对象。然后将这两个列表相互比较以生成字符串列表。现在想象一下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 %')