我在数据库中有一个表,它是键/值对的存储,其中包含一些关于存储在值字段中的数据类型的类型信息。
我已经阅读了有关创建无类型数据提供程序的博客系列,并且已经从 odata 中抓取并弄乱了样本,但我无法弄清楚如何将使用内存字典作为后备存储的样本转换为使用EF 或 Linq to Sql 实体作为数据的实际存储。
我在数据库中有一个表,它是键/值对的存储,其中包含一些关于存储在值字段中的数据类型的类型信息。
我已经阅读了有关创建无类型数据提供程序的博客系列,并且已经从 odata 中抓取并弄乱了样本,但我无法弄清楚如何将使用内存字典作为后备存储的样本转换为使用EF 或 Linq to Sql 实体作为数据的实际存储。
你问的比较难。示例使用 Dictionary 的原因是为了避免编写自定义 LINQ 提供程序(IQueryable 实现)。在你的情况下,这几乎是你需要做的。此外,似乎 EF 和 LINQ to SQL 都不适合您,因为两者都假设 statis 数据模型,其中实体是表中的行,属性是该表的列(粗略地说)。对你来说似乎不是这样。如果我理解正确,您的模型中每个属性都有一行。要完成这项工作,您必须至少部分实现 IQueryable 并使其了解您的数据结构。例如过滤不同,通常对 Name 属性的简单过滤器可以在 DB 中表示为 WHERE Name='...',但在您的情况下,这可能会转化为连接,您需要在键/值表中搜索具有名称的行,然后比较其值。您可以使用上面建议的方法,将所有内容加载到内存中。编码相当简单,但它将所有内容加载到内存中。或者您可以尝试编写自定义 LINQ 提供程序。这很难。但是如果你想尝试一下,我建议你看看这个博客系列,它基本上描述了如何实现 LINQ to SQL 之类的东西:http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx 我正在写一个系列,描述你使用什么类型的 eof 表达式provider 需要支持才能使用 WCF 数据服务。这也可以派上用场:http: //blogs.msdn.com/b/vitek/archive/2010/02/25/data-services-expressions-part-1-intro.aspx 请注意,可以只写提供者自己的一部分。例如,您可以自己处理过滤并将复杂的投影/扩展留给 LINQ to Objects。这种方法可以使您的提供者更容易实现。
好的,这就是我到目前为止所拥有的。唯一的问题是所有查询都必须在内存中执行:
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;
}