Re[23]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 06.07.14 11:38
Оценка: -1
AP>>Я устранил проблемы связанные с динамическим SQL
G>Устранил? Не смеши мои тапочки.
G>Бери код и покажи проект, который автоматом проверит все запросы на корректность http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created
В чем проблема?
            Filter? filter = Filter.Suggested;
            Option<string> search = "%test%";
            var paging = BatchQuery<Paging<ITagSynonym, int?>>.New(new {
                filter, user = new {IsAnonymous = false, IsModerator = false, Id = 1}, tagScoreRequiredToVote = 10,
                search, tab = Tab.Newest, start = 0, pageSize = 20
            }, @"
SELECT  TagSynonyms.Id, SourceTagName, TargetTagName, OwnerUserId, ApprovalDate, TagSynonyms.CreationDate,
        AutoRenameCount, Score, SourceTags.Id AS SourceTagId, TargetTags.Id AS TargetTagId, Users.DisplayName
@MainQuery()
ORDER BY
@switch (tab) {
    case Tab.Newest:
        @:CreationDate DESC, Id
        break;
    case Tab.Master:
        @:TargetTagName ASC, AutoRenameCount DESC, Id
        break;
    case Tab.Synonym:
        @:SourceTagName ASC, AutoRenameCount DESC, Id
        break;
    case Tab.Votes:
        @:Score DESC, TargetTagName ASC, AutoRenameCount DESC, Id
        break;
    case Tab.Creator:
        @:DisplayName, Id
        break;
    case Tab.Renames:
        @:AutoRenameCount DESC, TargetTagName, Id
        break;
}
OFFSET @start ROWS FETCH NEXT @pageSize ROWS ONLY
OPTION (OPTIMIZE FOR (@start = 0, @pageSize = 20));

SELECT COUNT(*) @MainQuery();

@helper MainQuery() {<text>
FROM    TagSynonyms
        LEFT JOIN Tags SourceTags ON SourceTagName = SourceTags.Name
        LEFT JOIN Tags TargetTags ON TargetTagName = TargetTags.Name
        LEFT JOIN Users ON Users.Id = OwnerUserId
WHERE   1 = 1
@switch (filter) {
    case Filter.Active:
        @:AND ApprovalDate IS NOT NULL
        break;
    case Filter.Suggested:
        @:AND ApprovalDate IS NULL
        if (!user.IsAnonymous && !user.IsModerator) {
        @:AND TargetTagName IN (@TargetTagNames())
        }
        break;
    case Filter.Merge:
        @:AND ApprovalDate IS NOT NULL AND ISNULL(SourceTags.Count, 0) > 0
        break;
}
@if (search.HasValue) {
        @:AND (SourceTagName LIKE @search OR TargetTagName LIKE @search)
}
</text>}
@helper TargetTagNames() {<text>
SELECT  Name
FROM    Tags
WHERE   Id IN (SELECT   Id
               FROM     UserTagTotals
               WHERE    UserId = @user.Id
                        AND TotalAnswerScort > @tagScoreRequiredToVote)
</text>}").Result();
            var rows = paging.Rows;
            var count = paging.Count;


G>Да, разница огромная. CheckAllQueries не работает с динмическим SQL.

Ты читать не умеешь? Там всё начинается с динамического SQL.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.