[Authorize(Roles="Admin,Manager")]
public class PermissionController : ApiController
{
[HttpGet]
public IEnumerable<permission> Get()
{
using (var mydb = new ModelContainer())
{
if(User.IsInRole("Admin")){
return mydb.permissionSet.ToList();
}
else
{
//////Work
return mydb.permissionSet.Where(x=>x.name!="Admin").ToList().Where(x=>x.name!="Coder").ToList().Where(x=>x.name!="Tester").ToList();
//////Not work
return from a in mydb.permissionSet where a.name!="Admin" && a.name!="Manager" && a.name!="Coder" && a.name != "Tester" select a;
}
}
}
}
我认为有两种方法可以返回正确的结果,上面的第一种方法可行,但看起来很奇怪,我认为它会多次查询。第二种方式似乎更好,但不起作用。
答案 0 :(得分:2)
使用LINQ,您正在构建查询。在这样的查询上调用ToList()将强制查询执行并返回结果。您的第一个选项将构建查询并返回结果。您的第二个选项返回查询。差别就是这样。
mydb.permissionSet.Where(x=>x.name!="Admin").ToList().Where(x=>x.name!="Coder").ToList().Where(x=>x.name!="Tester").ToList();
可以这样分解:
var qryNoAdmin = mydb.permissionSet.Where(x=>x.name!="Admin");
var permissionSetNoAdmins = qryNoAdmin.ToList();
var qryNoAdminNoCoder = permissionSetNoAdmins.Where(x=>x.name!="Coder");
var permissionSetNoAdminsNoCoders = qryNoAdminNoCoder.ToList();
var qryNoAdminNoCoderNoTester = permissionSetNoAdminsNoCoders .Where(x=>x.name!="Tester");
var permissionSetNoAdminsNoCodersNoTesters = qryNoAdminNoCoderNoTester.ToList();
return permissionSetNoAdminsNoCodersNoTesters;
如果这对您来说效率低下......是的。请查看@ user1778606建议,以提高效率。
现在您的第二个选项仅返回查询。如果您在其上调用ToList(),则将执行查询并获得结果。
var qryNoAdminNoCoderNoTester = from a in mydb.permissionSet where a.name!="Admin" && a.name!="Manager" && a.name!="Coder" && a.name != "Tester" select a;
var permissionSetNoAdminsNoCodersNoTesters = qryNoAdminNoCoderNoTester.ToList();
return permissionSetNoAdminsNoCodersNoTesters;
请注意我没有测试此代码。可能存在拼写错误。
答案 1 :(得分:1)
尝试将它们全部放在同一个where子句行中,即
return mydb.permissionSet.Where(x=>x.name!="Admin" & x.name!="Coder" & x.name!="Tester").ToList();
顺便说一下,我不认为它以你先做的方式重新查询,它只是过滤结果列表,但每次在过滤后重新创建列表可能会有一些开销,即。我想
return db.permissionSet.Where(x=>x.name!="Admin").Where(x=>x.name!="Coder").Where(x=>x.name!="Tester").ToList();
应该对上面的合并where子句同样有效