Given the following classes:
public class Lookup
{
public string Code { get; set; }
public string Name { get; set; }
}
public class DocA
{
public string Id { get; set; }
public string Name { get; set; }
public Lookup Currency { get; set; }
}
public class ViewA
{
public string Id { get; set; }
public string Name { get; set; }
public string CurrencyName { get; set; }
}
I can create an index that allows the client to request a view as follows:
public class A_View : AbstractIndexCreationTask<DocA, ViewA>
{
public A_View()
{
Map = docs => from doc in docs
select new ViewA
{
Id = doc.Id,
Name = doc.Name,
CurrencyName = doc.Currency.Name
};
Reduce = results => from result in results
group on new ViewA
{
Id = result.Id,
Name = result.Name,
CurrencyName = result.CurrencyName
} into g
select new ViewA
{
Id = g.Key.Id,
Name = g.Key.Name,
CurrencyName = g.Key.CurrencyName
};
}
}
This, of course, works and gives the desired presentation result with the data converted to the structure required in the client application. However, it is implausible, will be a nightmare for maintenance and probably quite ineffective with the entire design of the redundant object.
Is there an easier way to create an index with the required structure (ViewA) based on a set of documents (DocA)?
, , (ViewA), . , GROUP ON, SELECT, , :
1:
Reduce = results => from result in results
group on new ViewA
{
Id = result.Id,
Name = result.Name,
CurrencyName = result.CurrencyName
} into g
select g.Key;
: System.InvalidOperationException:
, " ".
2:
Reduce = results => from result in results
select new ViewA
{
Id = result.Id,
Name = result.Name,
CurrencyName = result.CurrencyName
};
: System.InvalidCastException: "ICSharpCode.NRefactory.Ast.IdentifierExpression" "ICSharpCode.NRefactory.Ast.InvocationExpression".
, " ".
, .
(: (ViewA) )
Daniel, , :
public class A_View : AbstractIndexCreationTask<DocA, ViewA>
{
public A_View()
{
Map = docs => from doc in docs
select new ViewA
{
Id = doc.Id,
Name = doc.Name,
CurrencyName = doc.Currency.Name
};
Store(x => x.CurrencyName, FieldStorage.Yes);
}
}