1

インデックスから変換式の一部を再利用して、ドキュメントが既に利用可能な場合にサービス レイヤーで同じ変換を実行できるようにしたいと考えています。

たとえば、クエリによるものであろうと、サービス レイヤーで既存のドキュメントを変換するものであろうと、次のような形の 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 を整数から文字列に変更することはできません。)

4

1 に答える 1

0

私はあなたのサンプルを完全にフォローするのに苦労しています。本当にこれを掘り下げる最良の方法は、失敗した自己完結型の単体テストを使用することです.

それでも、重要な部分を引き出せるかどうか見てみましょう。

変換では、ID を操作する 2 つの領域があります。

...
client = Database.Load(result.Id.ToString())
...
Id = this0.client.__document_id,
...

1result.Id行目とId =2 行目の は整数である必要があります。

Database.Load()文字列ドキュメント キーを想定しており、これは にも表示され__document_idます。

混乱は、Raven のドキュメント、コード、および例のすべてでidkeyという用語が同じ意味で使用されていることに起因しますが、これは文字列識別子を使用する場合にのみ当てはまります。ints や guid などの文字列以外の識別子を使用する場合、idは である可能性があります123が、ドキュメント キーは依然としてclients/123です。

したがって、変換を変更して変換してみてください。

...
client = Database.Load("clients/" + result.Id)
...
Id = int.Parse(this0.client.__document_id.Split("/")[1]),
...

...またはC#の同等のlinqフォームが何であれ。

于 2013-01-18T00:13:30.963 に答える