使用多个联接和谓词优化LINQ查询

djpark

假设我的SQL数据库中有三个表-Users,Books和UsersBooks。

我正在寻找优化Web方法的设计/性能的方法,该方法需要一个用户名列表并返回一个包含用户及其书本的JSON对象。我正在使用Linq2Entities和SQL Server 2008。

这个问题的动机是网络方法被称为很多(并且正在不断增长!),因此我需要找到方法使其变得更加精简和有意义。

这是当前设计的精简版:

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   
        }
    }
}
水下的

为什么不只是使用.Contains

var usersAndBooks = from u in db.Users
                    where userNames.Contains(u.UserName)
                    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 };

我认为在这里使用linqkit /谓词生成器/表达式访问器是过大的。您基本上可以IN使用LINQ来执行SQL子句.Contains

数据库对此进行优化要容易得多:

WHERE User.UserName IN ('user1', 'user2', 'user3')

...比这个:

WHERE User.UserName = 'user1' OR User.UserName = 'user2' OR User.UserName = 'user3'

其次,真的有必要遍历结果吗?

foreach(var name in userNames) {
    // Logic to construct final {User:{Books}} JSON object
}

...不确定这里的逻辑是什么,但是您可以仅使用另一个进行转换。选择:

// Logic to construct final {User:{Books}} JSON object
var finalOutput = usersAndBooks.Select(x => new ...);

除了缓存或诸如redis之类的其他快速数据传递服务之外,我只能推荐的另一件事是使用Newtonsoft JSON.Net而不是JavaScriptSerializer:

List<string> userNames = JsonConvert.DeserializeObject<List<string>>(input);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用多个联接和分组优化SQL查询(Postgres 9.3)

来自分类Dev

查询优化(多个联接)

来自分类Dev

在多个条件和子查询中使用LINQ左联接

来自分类Dev

多个内部联接和子查询的查询优化

来自分类Dev

使用多个包含语句优化 linq 查询

来自分类Dev

如何使用多个左联接优化SQL查询

来自分类Dev

使用左联接在多个表上优化SQL查询

来自分类Dev

内部联接和查询优化

来自分类Dev

使用联接优化 SQL 查询

来自分类Dev

LINQ查询交叉联接groupby优化

来自分类Dev

优化包含联接和子查询的查询

来自分类Dev

通过多个联接优化SQL查询

来自分类Dev

如何在MySQL中使用子查询为报表优化多个联接的查询

来自分类Dev

优化SQL分组依据和联接查询

来自分类Dev

优化SQL分组依据和联接查询

来自分类Dev

使用组和联接的C#中的LINQ查询

来自分类Dev

使用组和联接的C#中的LINQ查询

来自分类Dev

使用GROUP BY和COUNT优化/重写LINQ查询

来自分类Dev

在联接LINQ中使用多个条件。我和

来自分类Dev

使用联接对Linq的SQL查询

来自分类Dev

如何使用条件联接优化查询?

来自分类Dev

如何使用表联接优化此查询?

来自分类Dev

使用左联接优化MySql查询

来自分类Dev

如何使用自联接优化此查询?

来自分类Dev

没有多个联接的Linq查询

来自分类Dev

使用多个总和优化查询?

来自分类Dev

使用多个表优化查询

来自分类Dev

如何优化包含联接和子查询的查询

来自分类Dev

在 where 子句中使用自联接和 group bys 优化查询