0

我有这样的文件:

    {
       "Document":{
                  "Principles":[{"text":"Text","history":["Text1","Text2","Text3"]}]
                  }
    }

我想搜索所有包含“文本”历史的原则。

我有 2 个这样的接口:

[Entity]
public interface IDocument
{
   string Id{get;}

   ICollection<IPrinciple> Principles{get;set;}
}

[Entity]
public interface IPrinciple
{
   string Id{get;}

   ICollection<string> history{get;set;}

   string text{get;set;}
}

这是我所做的:

using(var context=new MyEntityContext(connectionString))
{
     var principles=(from p in context.Principles where p.history.Any(h=>h.Contains("Text")) select p).ToList();
}

但我得到一个不包含任何原则的列表。

4

2 回答 2

0

如果你尝试这样写:

 var principles= _context.Principles.Any(p => p.history.Contains("Text"));

您将收到以下错误:

NotSupportedException:LINQ-to-SPARQL 当前不支持结果运算符“Any()”

所以你的猜测是对的,目前 brightstarDB 似乎不支持 Any() 操作。

您始终可以将 Any 替换为 Where 并进行一些调整以获得类似(但有效)的结果

于 2016-12-12T08:05:07.310 回答
0

我不认为 Any() 是问题所在。这个程序工作得很好,从查询中返回了预期的 2 个原则。我只是完全按照您在原始问题中发布的那样使用 IPrinciple 和 IDocument 接口,并且查询也与您最初发布的完全一样。

class Program
{
    private static readonly string ConnectionString = "type=embedded;storesDirectory=brightstardb;storeName=anytest";
    static void Main(string[] args)
    {
        SetupStore();
        QueryStore();
    }

    private static void SetupStore()
    {
        if (!Directory.Exists("brightstardb"))
        {
            Directory.CreateDirectory("brightstardb");
            using (var context = new MyEntityContext(ConnectionString)
            )
            {
                var doc1 = context.Documents.Create();
                var doc2 = context.Documents.Create();
                var doc3 = context.Documents.Create();
                var p1 = context.Principles.Create();
                p1.History = new List<string> {"Strings", "of", "Text"};
                var p2 = context.Principles.Create();
                p2.History = new List<string> {"Nothing", "To See Here", "Move Along"};
                var p3 = context.Principles.Create();
                p3.History = new List<string> { "Another", "Principle containing Text"};
                doc1.Principles = new List<IPrinciple> {p1};
                doc2.Principles = new List<IPrinciple> {p2};
                doc3.Principles = new List<IPrinciple> {p3};
                context.SaveChanges();
            }
        }
    }

    private static void QueryStore()
    {
        using (var context = new MyEntityContext(ConnectionString))
        {
            var principles = (from p in context.Principles where p.History.Any(h => h.Contains("Text")) select p).ToList();
            foreach (var p in principles)
            {
                Console.WriteLine("Found principle: {0}", p.Id);
            }
        }
    }
}
于 2016-12-12T11:59:56.607 回答