インデックスから変換式の一部を再利用して、ドキュメントが既に利用可能な場合にサービス レイヤーで同じ変換を実行できるようにしたいと考えています。
たとえば、クエリによるものであろうと、サービス レイヤーで既存のドキュメントを変換するものであろうと、次のような形の ViewModel オブジェクトを生成したいと考えています。
public class ClientBrief
{
public int Id { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
// ellided
}
この文書モデルから:
public class Client
{
public int Id { get; private set; }
public CompleteName Name { get; private set; }
public Dictionary<EmailAddressKey, EmailAddress> Emails { get; private set; }
// ellided
}
public class CompleteName
{
public string Title { get; set; }
public string GivenName { get; set; }
public string MiddleName { get; set; }
public string Initials { get; set; }
public string Surname { get; set; }
public string Suffix { get; set; }
public string FullName { get; set; }
}
public enum EmailAddressKey
{
EmailAddress1,
EmailAddress2,
EmailAddress3
}
public class EmailAddress
{
public string Address { get; set; }
public string Name { get; set; }
public string RoutingType { get; set; }
}
完全な Client ドキュメントを ClientBrief ビュー モデルに変換する式があります。
static Expression<Func<IClientSideDatabase, Client, ClientBrief>> ClientBrief = (db, client) =>
new ClientBrief
{
Id = client.Id,
FullName = client.Name.FullName,
Email = client.Emails.Select(x => x.Value.Address).FirstOrDefault()
// ellided
};
次に、この式は式ビジターを使用して操作されるため、インデックス (Client_Search) の TransformResults プロパティとして使用できます。アプリケーションの起動時に生成されると、Raven Studio で次のように定義されます。
地図:
docs.Clients.Select(client => new {
Query = new object[] {
client.Name.FullName,
client.Emails.SelectMany(x => x.Value.Address.Split(new char[] {
'@'
})) // ellided
}
})
(Query
フィールドは分析されます。)
変身:
results.Select(result => new {
result = result,
client = Database.Load(result.Id.ToString())
}).Select(this0 => new {
Id = this0.client.__document_id,
FullName = this0.client.Name.FullName,
Email = DynamicEnumerable.FirstOrDefault(this0.client.Emails.Select(x => x.Value.Address))
})
ただし、クライアント ドキュメントが既にある場合は、インデックスの作成に使用される変換式をサービス レイヤーでローカルに使用することもできます。
var brief = ClientBrief.Compile().Invoke(null, client);
これにより、コードがデータベースで実行されているか、クライアント アプリで実行されているかに関係なく、Client から ClientBrief へのマッピングを理解するコードを 1 つだけ持つだけで済みます。クエリ結果の ID がすべて0
.
Id プロパティ (整数) をクエリに適切に入力するにはどうすればよいですか?
ここで同様の質問をいくつか読みましたが、提案された回答はどれもうまくいかないようです。(ID を整数から文字列に変更することはできません。)