동적 쿼리

c# dapper linq

문제

나는 이걸로 노력하고있어. 필자는 다음과 같이 10 가지 초보자 단위 테스트를 작성했습니다.

[Fact]
public void TestOredGuids()
{
    // Arrange
    const string expectedSql = "SELECT * FROM Products WHERE SomeExternalForeignKey = @SomeExternalForeignKey OR Name = SomeExternalForeignKey = @SomeExternalForeignKey";

    // Act
    var result = DynamicQuery.GetDynamicQuery<Product>("Products", p => p.SomeExternalForeignKey == new Guid("28D3BCFB-9472-4141-BD88-BE5E7E1230F0") || p.SomeExternalForeignKey == new Guid("0F0DBA45-F842-4E46-9ED4-F50B5BCF0509"));

    // Assert

}

internal class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public DateTime ExpiryDate { get; set; }
    public int CategoryId { get; set; }
    public Guid SomeExternalForeignKey { get; set; }
}

불행히도, 나는 항상 얻고있다 :

Additional information: 'System.Linq.Expressions.NewExpression' does not contain a definition for 'Value'

WalkTree 메서드에서. 내가 GetDynamicQuery를 잘못 사용하고 있습니까?

dapper에 대해 이와 같이 동적 SQL mappers를 구현 한 경우 포인터가 유용 할 것입니다. 감사!

인기 답변

내가 사용하려고하는 컴포넌트의 소스 코드에서 볼 수 있듯이, 표현식의 오른쪽 피연산자가 ConstantExpression 이 될 것으로 예상합니다 (작성자가 dynamic 사용하고 Value 속성을 예상 함). 작동, 당신은 다음과 같이 코드를 수정

var someExternalForeignKey1 = new Guid("28D3BCFB-9472-4141-BD88-BE5E7E1230F0");
var someExternalForeignKey2 = new Guid("0F0DBA45-F842-4E46-9ED4-F50B5BCF0509");
var result = DynamicQuery.GetDynamicQuery<Product>("Products", p => p.SomeExternalForeignKey == someExternalForeignKey1 || p.SomeExternalForeignKey == someExternalForeignKey2);

업데이트 : ConstantExpression 이 아닌 클로저를 생성하기 때문에 위의 방법도 작동하지 않습니다. 원래 코드와 함께 작동하게하려면 DynamicQuery 클래스의 필수 수정 사항을 다음과 같이 작성하십시오.

private static void WalkTree(BinaryExpression body, ExpressionType linkingType,
                             ref List<QueryParameter> queryProperties)
{
    if (body.NodeType != ExpressionType.AndAlso && body.NodeType != ExpressionType.OrElse)
    {
        string propertyName = GetPropertyName(body);
        var propertyValue = GetPropertyValue(body.Right);
        string opr = GetOperator(body.NodeType);
        string link = GetOperator(linkingType);

        queryProperties.Add(new QueryParameter(link, propertyName, propertyValue, opr));
    }
    else
    {
        WalkTree((BinaryExpression)body.Left, body.NodeType, ref queryProperties);
        WalkTree((BinaryExpression)body.Right, body.NodeType, ref queryProperties);
    }
}

private static object GetPropertyValue(Expression source)
{
    var constantExpression = source as ConstantExpression;
    if (constantExpression != null)
        return constantExpression.Value;
    var evalExpr = Expression.Lambda<Func<object>>(Expression.Convert(source, typeof(object)));
    var evalFunc = evalExpr.Compile();
    var value = evalFunc();
    return value;
}

그러나 전체 클래스 (작성자 상태)는 예제 일 뿐이며, 예를 들어 속성 ​​당 하나의 매개 변수 (따라서 하나의 값)를 매핑하므로 GetDynamicQuery 메서드는 추가 작업이 필요합니다. 대신 이 방법을 시도해보십시오. 희망이 도움이됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow