更好,更正确的多条件查询方式?

时间:2013-05-23 03:58:24

标签: entity-framework

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

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

2 个答案:

答案 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;

请注意我没有测试此代码。可能存在拼写错误。

建议阅读:Introduction to LINQ Queries (C#)

答案 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子句同样有效