- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Nancy 和 RavenDB 构建一个照片库我的模型类如下:
[JsonObject(IsReference=true)]
public class Album
{
public Album()
{
this.Photos = new List<Photo>();
this.Tags = new List<String>();
}
public String Id {get; set;}
public String Name {get; set;}
public String Path {get; set;}
public DateTime ModifiedDate{get; set;}
public IList<String> Tags {get; set;}
public IList<Photo> Photos {get; set;}
}
public class Photo
{
public String Id {get; set;}
public String Name {get; set;}
public String Path {get; set;}
public IList<String> Tags {get; set;}
public Album Album {get; set;}
public DateTime ModifiedDate{get; set;}
public bool IsPrivate{get; set;}
}
我尝试在 Photo->Tags 上减少 map 索引:
public class TaggedPhotosIndex:AbstractIndexCreationTask<Album, TaggedPhotos>
{
public TaggedPhotosIndex()
{
Map = albums =>
from a in albums
from p in a.Photos
from t in p.Tags
select new TaggedPhotos
{
Tag = t,
PhotoIds = new List<String> {p.Id}
};
Reduce = results =>
from result in results
group result by result.Tag into agg
select new TaggedPhotos
{
Tag = agg.Key,
PhotoIds = agg.SelectMany(a => a.PhotoIds).ToList()
};
}
}
public class TaggedPhotos
{
public String Tag {get; set;}
public IList<String> PhotoIds {get; set;}
}
这是我想要实现的:
给定一组标签,我想获取所有具有至少一个匹配标签的照片对象。
RavenDB 不允许在查询中使用 SelectMany 并且没有想法。
找到了解决方案(使用 LuceneQuery @ Workaround for selectmany in ravendb using client api),但期待任何其他替代方案。
最佳答案
您的文档结构存在一些问题,这将使您的查询变得困难。
查询设计以返回整个文档。您要求从文档中获得部分结果。这是可以做到的,但前提是您将所有字段存储在索引中并从那里投影结果。您放弃了文档存储的 ACID 保证,这是 RavenDB 最强大的功能之一。
您有一个从 Photo
返回到 Album
的引用,这通常会被嵌入,导致循环引用,除非您正在设置 [JsonObject( IsReference=true)]
来避免这种情况。这可能适用于单个文档中的基本序列化,但在从投影索引值引用整个文档时毫无意义。您已经设置了自己的“先有鸡还是先有蛋”问题。
您仍然缺少人们期望从这个问题领域获得的基本功能。具体来说,您应该能够加载单张照片而无需加载整个相册。
我强烈建议您将照片放在自己的文档中。然后你可以有更简单的索引并避免循环引用。在 DDD术语,Photo
和Album
都是聚合。一个 DDD 聚合 == 一个 RavenDB 文档。您当前正在将照片建模为非聚合的实体,但随后您要求执行只能针对聚合执行的操作 - 例如搜索。
如果您只是问“给我所有包含带有这些标签之一的照片的相册”,那么您就可以了。但您不是要相册,而是要照片。
假设您确实以这种方式建模,Brett 的答案很接近 - 但有一些无关的东西。这是一个显示完整实现的单元测试。发布要点,因为它没有直接解决原始问题。 https://gist.github.com/4499724
关于c# - RavenDB SelectMany 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14228793/
这个问题已经有答案了: Difference Between Select and SelectMany (21 个回答) 已关闭 5 年前。 我遇到了 SelectMany 表达式的问题,我无法理解
此查询返回员工 ID、姓名、公司 ID、公司名称和公司城市。我缺少员工电子邮件地址(emailAddress 存储在 EmployeeEmailAddress 表中)和员工电话号码(phoneNumb
文章中Deep Dive into Rx SelectMany作者在最后的注释中提到了以下内容; Note: To mitigate the ordering issue, SelectMany()
我正在解析 XML 结构,我的类如下所示: class MyXml { //... List Content { get; set; } //... } class Node
我在用户组中有动态字段,我想根据用户组中的用户来选择它们。 基本上我想模拟像 .Where(x => x.UserGroupId == x || ... 这样的查询,否则它会进行大约 20 个查询来获
您好,我正在通过 MS 101 linq 示例编写代码。 “JoinOperators”给我带来了困难,因为我试图将查询表达式重构为 lambda 语法,反之亦然。 无论如何,在例子105我看到这个查
如果没有输入和输出,很难解释这一点。我制作了一个简单的汽车示例,以避免我的项目出现不必要的细节。 我有这个列表: List cars = new List() { new car() { ca
所以我有这些部分类。有关 ParseFCIE 的部分实现和我的问题,请参见下文。 class CiscoSwitch { Dictionary VSANList = new Dictionar
众所周知,Enumerable.SelectMany将一系列序列展平为单个序列。如果我们想要一种可以压平序列序列序列的序列的方法,等等递归怎么办? 我很快想出了一个使用 ICollection 的实现
这个问题在这里已经有了答案: SelectMany() Cannot Infer Type Argument -- Why Not? (1 个回答) 关闭 7 年前。 当我尝试编译我的代码时出现以下
我正在使用 NUnit、Moq 和 StructureMap。 我有以下 NUnit 测试: [Test] public void ShouldCallCustomMethod_For
我已经尝试了很长时间来寻找一种“干净”的模式来处理具有匿名类型的 .SelectMany,当您并不总是希望返回结果时。我最常见的用例如下所示: 我们有一份客户名单,我想对其进行报告。 每个客户的数据都
假设我有以下通用组合生成器静态方法: public static IEnumerable> GetAllPossibleCombos( IEnumerable> items) { IE
我可以使用 SelectMany 展平集合中子集合的结果: // a list of Foos, a Foo contains a List of Bars var source = new Li
基本上,我想做的是左外连接两个表并将它们呈现在一个平面结果中。为简单起见,我的两个表如下所示: tot["nameA", "nameB", "nameC"] critItg["nameA", "nam
如何以另一个 .SelectMany() 形式编写此 LINQ 表达式? var result = from a in numbersA
我目前正在查询如下字典, foreach (var instance in Dict) { X += $"(Description = '{instance.Key}') OR "; } 我可以
仅使用扩展方法应用 SelectMany 获得三个或更多序列的交叉连接的最佳方法是什么?有没有其他方法可以实现交叉连接? 测试数据 var a = Enumerable.Range(11, 2); v
我正在使用 Nancy 和 RavenDB 构建一个照片库我的模型类如下: [JsonObject(IsReference=true)] public class Album { public
我想知道如何使用SelectMany()。这似乎需要很多争论,从我自己的研究中我注意到 SelectMany() 可能是所有其他选择操作的“父亲”。 最佳答案 选择多个允许您从查询源中选择一个 IEn
我是一名优秀的程序员,十分优秀!