gpt4 book ai didi

c# - 在 RavenDB 中将文档展平为 View 的最简单方法

转载 作者:太空狗 更新时间:2023-10-29 23:25:22 26 4
gpt4 key购买 nike

给定以下类:

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 // Simply a flattened version of the doc
{
public string Id { get; set; }
public string Name { get; set; }
public string CurrencyName { get; set; } // View just gets the name of the currency
}

我可以创建一个索引,让客户端可以按如下方式查询 View :

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
};
}
}

这当然有效,并产生了 View 的预期结果,其中数据转换为客户端应用程序所需的结构。然而,它非常冗长,将成为维护的噩梦,并且对于所有冗余对象构造来说效率可能相当低。

在给定文档集合 (DocA) 的情况下,是否有更简单的方法来创建具有所需结构 (ViewA) 的索引?

更多信息问题似乎是为了让索引保存转换后的结构 (ViewA) 中的数据,我们必须执行 Reduce。似乎 Reduce 必须同时具有 GROUP ON 和 SELECT 才能按预期工作,因此以下内容无效:

无效的 REDUCE 条款 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:变量初始值设定项选择必须具有带有对象创建表达式的 lambda 表达式

显然我们需要“选择新的”。

无效的 REDUCE 条款 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”。

很明显,我们还需要有“group on new”。

感谢您提供的任何帮助。

(注意:从构造函数调用中删除类型(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
};

// Top-level properties on ViewA that match those on DocA
// do not need to be stored in the index.
Store(x => x.CurrencyName, FieldStorage.Yes);
}
}

最佳答案

一种解决方案,只需在 Map 中展平并配置索引以仅存储 DocA 中不存在的属性。

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
};

// Top-level properties on ViewA that match those on DocA
// do not need to be stored in the index.
Store(x => x.CurrencyName, FieldStorage.Yes);
}
}

关于c# - 在 RavenDB 中将文档展平为 View 的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com