Database 关系数据的LiteDB查询联接和输入
我正在使用LiteDB构建一个非常简单的博客,但是在通过博客标签获取查询时遇到了问题 目前我只有两个简单的对象,一个Database 关系数据的LiteDB查询联接和输入,database,linq,left-join,litedb,Database,Linq,Left Join,Litedb,我正在使用LiteDB构建一个非常简单的博客,但是在通过博客标签获取查询时遇到了问题 目前我只有两个简单的对象,一个文章和一个标签 public class Tag { public int ID { get; set; } public string name { get; set; } } // https://github.com/mbdavid/LiteDB/issues/1638 public class Article {
文章
和一个标签
public class Tag
{
public int ID { get; set; }
public string name { get; set; }
}
// https://github.com/mbdavid/LiteDB/issues/1638
public class Article {
public int ID { get; set; }
public long DateTime { get; set; } = System.DateTime.Now.ToUnix();
public long LastEdit { get; set; } = System.DateTime.Now.ToUnix();
public string title { get; set; }
public string url => String.Concat("/Blog/", this.title.ValidFileName(), "-", this.ID.ToString());
public string article { get; set; }
public int authorId { get; set; }
public string authorName { get; set; }
public bool publish { get; set; }
public string[] images { get; set; }
[BsonRef("tags")]
public Tag[] Tags { get; set; }
}
我可以使用此代码插入博客及其相应的标签
注意;关于Article.ID、Article.title以及Tag.ID和Tag.name的索引
public static void Insert(Blog.Article Article)
{
// Open database (or create if doesn't exist)
using (var db = new LiteDatabase(connection))
{
ILiteCollection<Blog.Tag> Tags = db.GetCollection<Blog.Tag>("tags");
try
{
Tags.EnsureIndex(p => p.ID, true);
Tags.EnsureIndex(p => p.name, true);
}
catch { }
if (Article.Tags != null)
{
foreach (Blog.Tag Tag in Article.Tags)
{
Tag.ID = Tags.Insert(Tag);
}
}
// Get a collection (or create, if doesn't exist)
ILiteCollection<Blog.Article> Articles = db.GetCollection<Blog.Article>("articles");
try
{
Articles.EnsureIndex(p => p.ID, true);
Articles.EnsureIndex(p => p.title, true);
}
catch { }
// Insert new Article (Id will be auto-incremented)
Articles.Insert(Article);
}
}
Linq中嵌套的Any
适用于其他内容,但为此我得到了NullReferenceException:Object reference未设置为对象的实例。
我不确定空引用在本例中的位置,我怀疑这是由于LiteDB操作连接的方式造成的,也许此时不存在文章标记数据
我尝试过不同的变化,比如
a.Tags.Select(x => x.ID).Intersect(TagList).Any())
当转换为BsonExpression时,Enumerable中的方法Intersect(IEnumerable)不受支持,这会产生错误
因此,就目前而言,我不得不退一步,只允许查询单个标记,但我想要的是(伪代码)“从文章中选择*,将tags.id放入(*mylist逗号分隔*)
类型查询,这是我在SQL中使用的
a.Tags.Select(a=>a.ID).Any(x => TagList.Any(y => y == x))
a.Tags.Select(x => x.ID).Intersect(TagList).Any())