Linq Dynamics добавляет N к моим параметрам - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над пользовательским фильтром с System.Linq.Dynamic, все было хорошо, пока я не начал бой с BETWEEN.

Я создал собственный класс с именем Filtro, у него есть такие свойства.

public string PropertyName { get; set; }
public string Value1 { get; set; }
public string Value2 { get; set; }

Затем я в основном фильтрую объект IQueryable с параметрами этого класса

Я пытаюсь это:

var query = db.Where("@0 > @1 AND @0 < @2", filtro.PropertyName, filtro.Value1, filtro.Value2);

Моя проблема заключается в том, что параметры неправильно генерируются в запросе.

Пример:

filtro.PropertyName = "example";
filtro.Value1 = "10";
filtro.Value2 = "20";

Когда я генерирую запрос без параметров

var query = db.Where("example>10 && example<20");

Он генерирует это:

SELECT 
    [Extent1].[randomField] AS [randomField], 
    [Extent1].[example] AS [example], 
    FROM [dbo].[Transformador] AS [Extent1]
    WHERE ([Extent1].[example] > cast(10 as decimal(18))) AND ([Extent1].[example] < cast(20 as decimal(18)))
    ORDER BY [Extent1].[randomField] ASC}

Но когда я использую параметры (как я показал ранее), я получаю это

SELECT 
    [Extent1].[randomField] AS [randomField], 
    [Extent1].[example] AS [example]
    FROM [dbo].[Transformador] AS [Extent1]
    WHERE (N'example' > N'10') AND (N'example' < N'20')
    ORDER BY [Extent1].[randomField] ASC

Я полагаю, что я неправильно использую параметры Linq Dynamics, но я не нашел ничего похожего в интернете

Надеюсь, кто-то знает, в чем проблема, заранее спасибо!

1 Ответ

0 голосов
/ 04 июля 2018

Проблема в том, что Dynamic Linq предполагает, что передаваемое вами значение example представляет собой значение , а не столбец имя. Таким образом, запрос не возвращает строк, потому что строка example не находится между строками 10 и 20.

Префикс N' является совершенно нормальным синтаксисом SQL и приводит только строку к типу NVARCHAR вместо VARCHAR. См. это для получения дополнительной информации. Для вашего кода, однако, попробуйте это, например:

var sql = $"{filtro.PropertyName} > @0 AND {filtro.PropertyName} < @1";
var query = db.Where(sql, filtro.Value1, filtro.Value2);

Примечание: это оставляет вас открытыми для SQL-инъекций, так что это довольно опасно.

...