Daeamon
@Daeamon

Как в Dapper и SqlBuilder пробрасывать параметры?

Есть код:
var builder = new StackExchange.Profiling.Helpers.Dapper.SqlBuilder();
            var queryParams = new Dictionary<string, object>() { };
            var countTmpl = builder.AddTemplate("select count(*) from Article /**where**/");
            //var selectorTmpl = builder.AddTemplate("select * from Article /**where**/ /**orderby**/");
            int start = filter.Params.GetStart();
            int end = filter.Params.GetEnd();
            var selectorTmpl = builder.AddTemplate(@"SELECT  x.*
                                                        FROM    ( SELECT a.*, ROW_NUMBER() OVER (/**orderby**/) AS RowNum
                                                                  FROM Article a
                                                                  /**where**/
                                                                ) AS x
                                                        WHERE RowNum between @start and @end
                                                        ORDER BY RowNum", new { start = start, end = end });

            queryParams.Add("start", start);
            queryParams.Add("end", end);
            
            if (!String.IsNullOrEmpty(filter.Alias))
            {
                string Alias = String.Format("%{0}%", filter.Alias);
                builder.Where("Alias LIKE @Alias", new { Alias = Alias });
                queryParams.Add("Alias", Alias);
            }
            if (filter.Category != null)
            {
                builder.Where("Category = @Category", new { Category = filter.Category });
                queryParams.Add("Category", filter.Category);
            }
            if (!String.IsNullOrEmpty(filter.Content))
            {
                string Content = String.Format("%{0}%", filter.Content);
                builder.Where("Content LIKE @Content", new { Content = Content });
                queryParams.Add("Content", Content);
            }
            if (filter.From != null && filter.To != null)
            {
                builder.Where("Created >= @From", new { From = filter.From });
                builder.Where("Created <= @To", new { To = filter.To });
                queryParams.Add("From", filter.From);
                queryParams.Add("To", filter.To);
            }
            if (filter.ID != null)
            {
                builder.Where("ID = @ID", new { ID = filter.ID });
                queryParams.Add("ID", filter.ID);
            }
            if (!String.IsNullOrEmpty(filter.Lead))
            {
                string Lead = String.Format("%{0}%", filter.Lead);
                builder.Where("Lead LIKE @Lead", new { Lead = Lead });
                queryParams.Add("Lead", Lead);
            }
            if (!String.IsNullOrEmpty(filter.MetaDescription))
            {
                string MetaDescription = String.Format("%{0}%", filter.MetaDescription);
                builder.Where("MetaDescription LIKE @MetaDescription", new { MetaDescription = MetaDescription });
                queryParams.Add("MetaDescription", MetaDescription);
            }
            if (!String.IsNullOrEmpty(filter.MetaKeywords))
            {
                string MetaKeywords = String.Format("%{0}%", filter.MetaKeywords);
                builder.Where("MetaKeywords LIKE @MetaKeywords", new { MetaKeywords = MetaKeywords });
                queryParams.Add("MetaKeywords", MetaKeywords);
            }
            if (!String.IsNullOrEmpty(filter.MetaTitle))
            {
                string MetaTitle = String.Format("%{0}%", filter.MetaTitle);
                builder.Where("MetaTitle LIKE @MetaTitle", new { MetaTitle = MetaTitle });
                queryParams.Add("MetaTitle", MetaTitle);
            }
            if (!String.IsNullOrEmpty(filter.OgpDescription))
            {
                string OgpDescription = String.Format("%{0}%", filter.OgpDescription);
                builder.Where("OgpDescription LIKE @OgpDescription", new { OgpDescription = OgpDescription });
                queryParams.Add("OgpDescription", OgpDescription);
            }
            if (!String.IsNullOrEmpty(filter.OgpTitle))
            {
                string OgpTitle = String.Format("%{0}%", filter.OgpTitle);
                builder.Where("OgpTitle LIKE @OgpTitle", new { OgpTitle = OgpTitle });
                queryParams.Add("OgpTitle", OgpTitle);
            }
            if (!String.IsNullOrEmpty(filter.ServiceComment))
            {
                string ServiceComment = String.Format("%{0}%", filter.ServiceComment);
                builder.Where("ServiceComment LIKE @ServiceComment", new { ServiceComment = ServiceComment });
                queryParams.Add("ServiceComment", ServiceComment);
            }
            if (filter.State != null)
            {
                builder.Where("State = @State", new { State = filter.State });
                queryParams.Add("State", filter.State);
            }
            if (filter.Title != null)
            {
                string Title = String.Format("%{0}%", filter.Title);
                builder.Where("Title LIKE @Title", new { Title = Title });
                queryParams.Add("Title", Title);
            }
            string OrderBy = filter.OrderBy.ToString();
            switch (filter.OrderDir)
            {
                case OrderDirArticle.DESC:
                    builder.OrderBy(OrderBy + " DESC");
                    break;
                case OrderDirArticle.ASC:
                    builder.OrderBy(OrderBy);
                    break;
            }
            ArticlesFDB Result = new ArticlesFDB();

            using (SqlConnection db = new SqlConnectionFactory().Create(ConnectionString))
            {
                FDBParameters Params = filter.Params;
                if (Params == null)
                {
                    Params = new FDBParameters();
                }
                Params.Count = db.Query<int>(countTmpl.RawSql, queryParams).Single();
                Result.Params = Params;
                Result.Articles = db.Query<Article>(selectorTmpl.RawSql, queryParams);
            }
            return Result;


В самом конце хотел использовать как в примере(на самом деле большую часть кода взял отсюда):
https://samsaffron.com/archive/2011/09/05/Digging+...
т.е. вместо
Params.Count = db.Query<int>(countTmpl.RawSql, queryParams).Single();
                Result.Params = Params;
                Result.Articles = db.Query<Article>(selectorTmpl.RawSql, queryParams);


Делал так, но соответственно отсутствовало все что связано с queryParams = new Dictionary() { };
Params.Count = db.Query<int>(countTmpl.RawSql, countTmpl.Parameters).Single();
                Result.Params = Params;
                Result.Articles = db.Query<Article>(selectorTmpl.RawSql, selectorTmpl.Parameters );


Но так не работает, параметры не передаются. Может я где пропустил ссылку на что то?) Или так и надо параметры передавать? Или же есть вариант попроще.

Update 1:
Сейчас в коде исчезает надобность в прописывании параметров таким образом, но почему то же автор использует именно такую конструкцию!!!
builder.Where("OgpDescription LIKE @OgpDescription", new { OgpDescription = OgpDescription });

Update 2:
Забыл про using у меня сейчас такие(помимо всех тех что относятся непосредственно к самому проекту)
using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Configuration;
    using System.Data.SqlClient;
    using Dapper;
    using ByndyuSoft.Infrastructure.Dapper;
  • Вопрос задан
  • 1390 просмотров
Решения вопроса 1
Buzzz
@Buzzz
SharePoint | Office 365 | .Net Developer
Собираете запрос перед execute, а параметры внутрь. Для параметров и всяких сплитов все внутри Query к примеру:
connection.Query(query, param: new { par1 = value })
connection.Query(query,
(class1, class2) =>
{
.....
return class1;
},
splitOn:
"Cell10",
param: new {par1 = value, par2 = value, par3 = value }).ToList();

Еще бы проверил бы обновления dapper т.к. вы используете 3rd (ByndyuSoft.Infrastructure.Dapper;)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы