假设我的SQL数据库中有三个表 - Users,Books和UsersBooks。使用多个连接和谓词优化LINQ查询
我正在寻找方法来优化Web方法的设计/性能,该方法采用用户名列表并返回包含用户及其书籍的JSON对象。我正在使用Linq2Entities和SQL Server 2008.
这个问题的动机是Web方法被称为很多(并且正在增长!),所以我需要找到让它运行更加精简和更加新颖的方法。
下面是当前设计的一个精简版:
private string MyWebMethod(string input) {
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<string> userNames = serializer.Deserialize<List<string>>(input);
using(var db = new dbContext()) {
var usersAndBooks = from u in db.Users
join ub in db.UsersBooks on u.UserId equals ub.UserId
join b in db.Books on ub.BookId equals b.BookId
select new Result { User = u, UsersBooks = ub, Book = b };
var predicate = PredicateBuilder.False<Result>();
// Construct predicate to filter usersAndBooks down to users we care about
foreach(var name in userNames) {
predicate = predicate.Or(r => r.User.UserName.Equals(name));
}
usersAndBooks = usersAndBooks.AsExpandable().Where(predicate);
foreach(var name in userNames) {
// Logic to construct final {User:{Books}} JSON object
}
}
}
谢谢 - 总是尽量保持简单。从这些变化中没有看到明显的性能提升,但绝对是一种更清洁的设计 – djpark
在这种情况下,我认为Pressacco的答案会对你更好。无论是制作自定义SQL查询还是预先计算数据并将其存储在可以快速获取到的位置。 – danludwig