0
[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;
            }
        }
    }
}

我认为有两种方法可以返回正确的结果,上面的第一种方法会起作用,但看起来很奇怪,我认为它会查询很多次。第二种方法似乎更好,但行不通。

4

2 回答 2

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;

请注意,我没有测试此代码。可能有错别字。

推荐阅读:LINQ 查询简介(C#)

于 2013-05-23T04:21:45.913 回答
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 子句同样有效

于 2013-05-23T04:02:07.680 回答