Я хочу построить Dapper строку, используя выражение LINQ в качестве аргумента метода.Я нашел в MS Docs пример синтаксического анализа и интегрировал его в мой код:
public static List<Notification> GetNotifs(Expression<Func<Notification, bool>> p)
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
{
string sqlQ = "SELECT * FROM Notifications WHERE ";
ParameterExpression param = p.Parameters[0];
BinaryExpression operation = (BinaryExpression)p.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
for (int i = 0; i < left.Name.Length; i++) { if (i <= param.Name.Length) { } else { sqlQ += left.Name[i]; } }
ConstantExpression right = (ConstantExpression)operation.Right;
if (operation.NodeType.ToString() == "LessThan") sqlQ += " <";
else if (operation.NodeType.ToString() == "GreaterThan") sqlQ += " >";
else if (operation.NodeType.ToString() == "LessThanOrEqual") sqlQ += " <=";
else if (operation.NodeType.ToString() == "GreaterThanOrEqual") sqlQ += " >=";
else if (operation.NodeType.ToString() == "Equal") sqlQ += " =";
else if (operation.NodeType.ToString() == "NotEqual") sqlQ += " !=";
sqlQ += " " + right.Value;
return connection.Query<Notification>(sqlQ).ToList();
}
}
Но, к сожалению, он дает InvalidCastException при
ParameterExpression left = (ParameterExpression)operation.Left;
Вызов этого методаэто как:
DRepository.GetNotifs(uid => uid.U_Id == id)
Не могли бы вы помочь мне выяснить, где я не прав?