Мне нужно строить запросы динамически (классы сущностей имеют более 30 свойств, и я хочу избежать нескольких операторов if).
Я решил это с помощью дерева отражений и выражений (итерация по свойствам и добавление предиката, если указаны некоторые критерии поиска).
Проблема в том, что он генерирует сырой SQL-скрипт.
Пример
SELECT
[Extent1].[ProductId] AS [ProductId],
[Extent1].[ManufacturerId] AS [ManufacturerId],
[Extent1].[Title] AS [Title]
FROM [dbo].[Products] AS [Extent1]
WHERE 3 = [Extent1].[ManufacturerId]
Мне нужно получить запрос, используя процедуру sp_executesql (возобновление того же плана выполнения запроса).
exec sp_executesql N'SELECT
[Extent1].[ProductId] AS [ProductId],
[Extent1].[ManufacturerId] AS [ManufacturerId],
[Extent1].[Title] AS [Title]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[ManufacturerId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=3
Оказалось, проблема в следующем методе. Он использует Expression.Constant для создания объекта Expression. Я не знаю, чем мне его заменить.
public static Expression<Func<TItem, bool>> PropertyEqual<TItem, TValue>(
this PropertyInfo property, TValue value)
{
var param = Expression.Parameter(typeof(TItem));
var body = Expression.Equal(Expression.Property(param, property),
Expression.Constant(value, typeof(TValue)));
return Expression.Lambda<Func<TItem, bool>>(body, param);
}
Как мне решить проблему?