具有SQL后备存储的OData UnTyped提供程序

时间:2010-06-27 19:33:06

标签: odata

我在数据库中有一个表,它是一个键/值对的存储,有一些关于存储在值字段中的数据类型的类型信息。

我已经阅读了有关创建无类型数据提供程序的博客系列,并且已经抓住并搞砸了odata中的示例,但我无法弄清楚如何使用内存中的字典来转动它作为后备存储的示例,使用EF或Linq到Sql实体作为实际的数据存储。

2 个答案:

答案 0 :(得分:1)

你要问的是相当难的。示例使用Dictionary的原因是为了避免编写自定义LINQ提供程序(IQueryable实现)。在你的情况下,这几乎是你需要做的。 此外,似乎EF和LINQ to SQL都不适用于您,因为它们都假定statis数据模型,其中实体是表中的行,属性是该表的列(粗略地说)。对你来说情况似乎并非如此。如果我理解正确,您的模型中每个属性都有一行。 要完成这项工作,您必须至少部分实现IQueryable并使其理解您的数据结构。例如,过滤是不同的,通常Name属性上的简单过滤器可以在DB中表示为WHERE Name ='...',但在您的情况下,这可能转换为您需要搜索键/值表的连接对于具有Name的行,然后比较其值。 您可以使用上面建议的方法,将所有内容加载到内存中。编码相当简单,但它将所有内容加载到内存中。 或者您可以尝试编写自定义LINQ提供程序。这很难。但是如果你想尝试一下,我建议你看看这个博客系列,它基本上描述了如何实现LINQ to SQL之类的东西:http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx 我正在编写一个系列文章,描述了您提供者需要支持的典型表达方式才能使其与WCF数据服务一起使用。这也可以派上用场:http://blogs.msdn.com/b/vitek/archive/2010/02/25/data-services-expressions-part-1-intro.aspx 请注意,可以自己只写部分提供程序。例如,您可以处理自己的过滤,并将复杂的投影/扩展保留到LINQ to Objects。这种方法可以使您的提供程序更容易实现。

答案 1 :(得分:0)

好的,这是我到目前为止所拥有的。唯一的问题是所有查询都必须在内存中执行:

public IList<DSPResource> GetResourceSetEntities(string resourceSetName) {
        List<DSPResource> entities;

        if (!this.resourceSetsStorage.TryGetValue(resourceSetName, out entities)) {
            entities = new List<DSPResource>();
            var resourceType = _metaData.ResourceSets.Single(r => r.Name == resourceSetName).ResourceType;
            var query = from v in _db.ChannelValues.GroupBy(x => x.ItemSetId)
                        select new DSPResource(resourceType,v.Key.Value, v);
            entities.AddRange(query.ToList());
            this.resourceSetsStorage[resourceSetName] = entities; 
        }
        return entities;
}