MSSQL — Хранимые процедуры

С сайта DEVELS.RU (уже не работает)

Хранимая процедура представляет собой запрос, хранящийся в БД SQL Server. Она повышает скорость и эффективность БД и вызывается командой

Exec имя_хранимой_процедуры

Базовая хранимая процедура.

Это самая простая хранимая процедура, которая возвращает результаты, не требуя никаких параметров.
Continue Reading →

Mongo и C#: агрегация, pipeline

Очень старый кусок кода (~2012-13 гг.), но вдруг пригодится когда-нибудь, память освежить.

            var match = new BsonDocument 
            { { 
                    "$match", new BsonDocument 
                    {         
                        {
                            "Date", new BsonDocument 
                            { { "$lte", DateTime.Now } }
                        }
                    } 
            } };
            var group = new BsonDocument
            { {
                    "$group", new BsonDocument
                    {
                        { "_id","$Blog._id" },
                        {
                            "PublishDate", new BsonDocument 
                            { { "$max", "$Date" } }
                        }
                    }
            } };

            var project = new BsonDocument
            { {
                    "$project", new BsonDocument
                    {
                        { "Blog._id", "$_id" },
                        { "PublishDate", "$PublishDate" }
                    }
            } };

            var sort = new BsonDocument { { "$sort", new BsonDocument { { "PublishDate", -1 } } } };
            var skip = new BsonDocument { { "$skip", (page - 1) * count } };
            var limit = new BsonDocument { { "$limit", count } };

            var pipeline = new[] { match, group, sort, project, skip, limit };
            var lastPostsInBlogs = this.mongoContext.Posts
                .Aggregate(pipeline)
                .ResultDocuments.Select(x => BsonSerializer.Deserialize(x))
                .ToList();

            return
                lastPostsInBlogs.Join(
                    this.mongoContext.Blogs.AsQueryable()
                        .Where(condition),
                    pb => pb.Blog.Id,
                    b => b.Id,
                    (pb, b) =>
                    new BlogItem()
                    {
                        Id = b.StrId,
                        Alias = b.Alias,
                        Title = b.Title,
                        Description = b.Info,
                        CoverFile = b.CoverFile ?? DomainAppSettings.DefaultPreview,
                        CanPost = b.Owner.AccountId == visitorId || (b.IsCommon && b.Members.Contains(visitorId)),
                        LastUpdated = b.LastUpdated,
                        LastPosts = this.mongoContext.Posts
                            .AsQueryable()
                            .Where(p => p.Blog.Id == b.Id && p.PublishDate  p.PublishDate)
                            .Take(3)
                            .Select(p => new PostLine()
                            {
                                Id = p.StrId,
                                Number = p.Number,
                                BlogAlias = p.Blog.Alias,
                                Title = p.Title,
                                Date = p.Date
                            })
                    }).ToArray();

LINQ Join vs. Contains

Хозяйке на заметку.
В данном примере всё выполняется в памяти приложения.

http://stackoverflow.com/questions/16824510/select-multiple-records-based-on-list-of-ids-with-linq

Solution with .Where and .Contains has complexity of O(N square). Simple .Join should have a lot better performance (close to O(N) due to hashing). So the correct code is:

_dataContext.UserProfile.Join(idList, up => up.ID, id => id, (up, id) => up);

And now result of my measurement. I generated 100 000 UserProfiles and 100 000 ids. Join took 32ms and .Where with .Contains took 2 minutes and 19 seconds! I used pure IEnumerable for this testing to prove my statement. If you use List instead of IEnumerable, .Where and .Contains will be faster. Anyway the difference is significant. The fastest .Where .Contains is with Set. All it depends on complexity of underlying coletions for .Contains. Look at this post to learn about linq complexity.Look at my test sample below:

    private static void Main(string[] args)
    {
        var userProfiles = GenerateUserProfiles();
        var idList = GenerateIds();
        var stopWatch = new Stopwatch();
        stopWatch.Start();
        userProfiles.Join(idList, up => up.ID, id => id, (up, id) => up).ToArray();
        Console.WriteLine("Elapsed .Join time: {0}", stopWatch.Elapsed);
        stopWatch.Restart();
        userProfiles.Where(up => idList.Contains(up.ID)).ToArray();
        Console.WriteLine("Elapsed .Where .Contains time: {0}", stopWatch.Elapsed);
        Console.ReadLine();
    }

    private static IEnumerable GenerateIds()
    {
       // var result = new List();
        for (int i = 100000; i > 0; i--)
        {
            yield return i;
        }
    }

    private static IEnumerable GenerateUserProfiles()
    {
        for (int i = 0; i < 100000; i++)
        {
            yield return new UserProfile {ID = i};
        }
    }

Console output:

Elapsed .Join time: 00:00:00.0322546
Elapsed .Where .Contains time: 00:02:19.4072107

А вот про SQL

http://stackoverflow.com/questions/1200295/sql-join-vs-in-performance

If the joining column is UNIQUE and marked as such, both these queries yield the same plan in SQL Server.

If it’s not, then IN is faster than JOIN on DISTINCT.

C#-MongoDB Polymorphic Classes

Появилась задача хранить документы с разной структурой в одной коллекции.

Вопрос на СО
http://stackoverflow.com/questions/13956413/mongodb-embedded-polymorphic-objects

Документация
http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#polymorphic-classes-and-discriminators

Мои примеры.
Continue Reading →

Подборка ссылок

Поработаем с MongoDb
http://habrahabr.ru/post/127290/

Experimenting with MongoDB from C#
http://odetocode.com/Blogs/scott/archive/2009/10/13/experimenting-with-mongodb-from-c.aspx

The NoSQL Movement, LINQ, and MongoDB – Oh My!
The NoSQL Movement, LINQ, and MongoDB – Oh My!

NoSQL Data Modeling Techniques
NoSQL Data Modeling Techniques

Куда идет NoSQL с MongoDB
http://msdn.microsoft.com/ru-ru/magazine/ee310029.aspx

MongoDB vs. SQL Server 2008 Performance Showdown
MongoDB vs. SQL Server 2008 Performance Showdown

PTOM: The Dependency Inversion Principle
http://lostechies.com/jimmybogard/2008/03/31/ptom-the-dependency-inversion-principle/

StructureMap — краткий справочник для работы (1/3)
http://habrahabr.ru/post/125613/

Феерическая расстановка точек над DI/IOC (контейнерами)
http://www.codehelper.ru/questions/352/феерическая-расстановка-точек-над-diioc-контейнерами

История одного маппера
http://gandjustas.blogspot.com/2010/01/blog-post.html

Ajax отправка данных из формы
http://itfound.ru/45-ajax-otpravka-dannih-formi.html

Backbone.js для «чайников»
http://habrahabr.ru/post/127049/

Javascript for Bootstrap — tabs
http://twitter.github.com/bootstrap/javascript.html#tabs

Написание сложных интерфейсов с Backbone.js
http://habrahabr.ru/post/118782/

Backbone Tutorials
http://backbonetutorials.com/

Backbone Todos
http://documentcloud.github.com/backbone/#examples-todos

jQuery.post()
http://api.jquery.com/jQuery.post/

Tag Cloud in ASP.NET MVC using Clickable HTML 5 Canvas Elements
http://www.dotnetcurry.com/ShowArticle.aspx?ID=785

Creating tag cloud using ASP.NET MVC and Entity Framework
http://weblogs.asp.net/gunnarpeipman/archive/2011/04/28/creating-tag-cloud-using-asp-net-mvc-and-entity-framework.aspx

Creating a Tag Cloud using ASP.NET MVC and the Entity Framework
http://www.mikesdotnetting.com/Article/107/Creating-a-Tag-Cloud-using-ASP.NET-MVC-and-the-Entity-Framework

Визуализация графов. Метод связывания ребер
http://habrahabr.ru/post/116758/

Эксперимент с голографическим кодированием и декодированием информации
http://habrahabr.ru/post/120051/

Z̩̣̫̗̙͇̯̣̓̔̆ͭA̳͔̖̔̆͡L̨̤̖͖̃ͫͧ͂ͨ̿̚͢G͓̭̦̺̗̱̲͙ͪ́Ơ̤̝̣̜͕̖̇̄!̼͎̰͔̽ͦ̍ͩ̏̾

http://textozor.com/zalgo-text/