Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 关系数据的LiteDB查询联接和输入_Database_Linq_Left Join_Litedb - Fatal编程技术网

Database 关系数据的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 {

我正在使用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 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())