它可能是。
假设如下:
起始大小,读取频率和基础表的更新频率的平衡是这样的,它没有任何意义与装载所有到更换整个事情记忆,只是反复看这个。
每个ID只有一个匹配的行。
行中还有一堆其他有趣的字段,我们不在乎这里。
然后如果我们用LINQ2SQL Table<Privileges>
取代PrivilegeMap,等效LINQ代码将是这样的:
var result = PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => new{p.ModeratorHasIt, p.AdminHasIt}).First()
if (myRole == User.Role.Admin)
{
return result.AdminHasIt;
}
if (myRole == User.Role.Moderator)
{
return result.ModeratorHasIt;
}
else
{
return false;
}
(对于这个问题var result = PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).First(p => new{p.ModeratorHasIt, p.AdminHasIt})
也可以写为var result = (from p in PrivilegeMap where p.PrivilegeActionId == actionID select new{p.ModeratorHasIt, p.AdminHasIt}).First()
这只是一个不同相同的LINQ操作的语法)。
比方说actionID
是2
您的代码将沿着线变成SQL:
SELECT * FROM特权WHERE privilegeActionId = 2
以上的Linq就会变成:
SELECT TOP 1 adminHasIt,moderatorHasIt FROM Privileges WHERE privilegeActionId
你可以看到,如果这是一个有很多列和/或如果有多个匹配的行,这可能会更有效率。
(如果PrivilegeMap是可枚举的但不可查询,它将变成一个操作,其中整个事物被加载和扫描,因此根本没有效率)。
另一方面,虽然产生该SQL的代码可能更复杂,并且它需要一些工作来设置特权实体对象。如果这是一次性操作,无论是开发人员还是运行时效率,这当然都不值得,但否则它可能会同时受益。
但是,请注意,在我们的两种情况下,我们都在不必要地查询。其实我与赔偿我:
if (myRole == User.Role.Admin)
{
return PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => p.AdminHasIt).First();
}
if (myRole == User.Role.Moderator)
{
return PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => p.ModeratorHasIt);
}
else
{
return false;
}
这将因为我们为myRole
任何其他值保证假不管是什么数据库状态只是adminHasIt,只是moderatorHasIt,或无论是查询不是在所有查询。
同样地,你会得到一个更简单的改进:
if(myRole != User.Role.Admin && myRole != User.Role.Moderator)
return false;
DataRow[] result = PrivilegeMap.Select("privilegeActionId=" + (int)actionId);
if (myRole == User.Role.Admin)
{
return Convert.ToBoolean(result[0]["adminHasIt"]);
}
if (myRole == User.Role.Moderator)
{
return Convert.ToBoolean(result[0]["moderatorHasIt"]);
}
在这里,我们首先避免数据库查询完全如果我们不可能使用它,只转换我们关心的领域,不随后将bool转换为bool。这种关于实际使用数据的地方性思维要容易得多,尽管大多数这种节省很少,但有些很大(这可能是潜在的),而且这是习惯问题,而不是复杂的折衷。
我删除了我的答案,因为我记得DataTable基于'Select'查询维护索引。 – Ani