bltoolkit icon indicating copy to clipboard operation
bltoolkit copied to clipboard

MethodExpressionAttribute on properties does not work

Open thtp opened this issue 10 years ago • 5 comments

I have the following test code:

    [MapIgnore]
    [MethodExpression("GetClientExpression")]
    public string ClientName
    {
        get
        {
            return GetClienName.Value(this);
        }
    }

    [MethodExpression("GetClientExpression")]
    public string GetClientName()
    {
        return GetClienName.Value(this);
    }

    private static readonly Lazy<Func<Project, string>> GetClienName = new Lazy<Func<Project, string>>(() => GetClientExpression().Compile());

    private static Expression<Func<Project, string>> GetClientExpression()
    {
        Expression<Func<Project, string>> expression = project => project
            .OwnerOrganization
            .OrganizationClientLinkups
            .Where(linkup => linkup.IsPrimaryFlag == "Y")
            .Select(linkup => linkup.Client.ClientName)
            .FirstOrDefault();
        return expression;
    }

GetClientName method works just fine. ClientName property throws an exceptions with message "Property 'System.String IsPrimaryFlag' is not defined for type 'Data.Model.Project'"

thtp avatar Mar 05 '15 14:03 thtp

Можно я по-русски? Исключение возникает, если в экспрешене присутствует Where или FirstOrDefault с условием. То есть, если из приведенного куска кода убрать .Where(linkup => linkup.IsPrimaryFlag == "Y") то маппинг работает и для свойств, и для методов. Но с Where(x => ...) или FirstOrDefault(x => ...) работает только для метода.

thtp avatar Mar 23 '15 13:03 thtp

ааа... видать я что-то не то починил :)))

ili avatar Mar 23 '15 13:03 ili

так конкретно какой код-то сломается... дай пример пжл...

ili avatar Mar 23 '15 13:03 ili

в смысле пример запроса

ili avatar Mar 23 '15 13:03 ili

Код в первом посте и есть пример.

Expression<Func<Project, string>> expression = project => project .OwnerOrganization .OrganizationClientLinkups // коллекция многие-ко-многим .Where(linkup => linkup.IsPrimaryFlag == "Y") // Без вот этой строчки все работает отлично .Select(linkup => linkup.Client.ClientName) .FirstOrDefault();

Вот такое выражение работает, если использовать его с методом:

[MethodExpression("GetClientExpression")]
public string GetClientName()
{
    return GetClienName.Value(this);
}

Но не работает, если использовать с полем:

[MapIgnore]
[MethodExpression("GetClientExpression")]
public string ClientName
{
    get
    {
        return GetClienName.Value(this);
    }
}

thtp avatar Mar 23 '15 16:03 thtp