MethodExpressionAttribute on properties does not work
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'"
Можно я по-русски? Исключение возникает, если в экспрешене присутствует Where или FirstOrDefault с условием. То есть, если из приведенного куска кода убрать .Where(linkup => linkup.IsPrimaryFlag == "Y") то маппинг работает и для свойств, и для методов. Но с Where(x => ...) или FirstOrDefault(x => ...) работает только для метода.
ааа... видать я что-то не то починил :)))
так конкретно какой код-то сломается... дай пример пжл...
в смысле пример запроса
Код в первом посте и есть пример.
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);
}
}