Нетипизированный поставщик OData с хранилищем SQL - PullRequest
1 голос
/ 27 июня 2010

У меня есть таблица в базе данных, которая является хранилищем пар ключ / значение, с некоторой информацией о типе данных, хранящихся в поле значения.

Я прочитал серию блогов по созданию провайдера нетипизированных данных, и взял и перепутал образцы из оддаты, но я не могу понять, как превратить образец, который использует словарь в памяти, какэто резервное хранилище, чтобы использовать либо EF, либо Linq to Sql, как фактическое хранилище данных.

Ответы [ 2 ]

1 голос
/ 28 июня 2010

То, что вы спрашиваете, довольно сложно.Причина, по которой примеры используют Словарь, состоит в том, чтобы избежать написания собственного поставщика LINQ (реализация IQueryable).В вашем случае это в значительной степени то, что вам нужно сделать.Кроме того, кажется, что ни EF, ни LINQ to SQL не будут работать для вас, поскольку оба предполагают модели данных statis, в которых сущности - это строки в таблице, а свойства - столбцы этой таблицы (грубо говоря).Похоже, это не так для вас.Если я правильно понимаю, у вас есть строка для свойства в вашей модели.Чтобы это работало, вам нужно было бы реализовать хотя бы частично IQueryable и дать ему понять вашу структуру данных.Например, фильтрация отличается, обычно простой фильтр по свойству Name может быть выражен в БД как WHERE Name = '...', но в вашем случае это, вероятно, приводит к объединению, в котором вам нужно выполнить поиск в таблице ключ / значениедля строки с именем, а затем сравните его значение.Вы можете использовать предложенный выше подход, который загружает все в память.Код довольно прост, но загружает все в память.Или вы можете попробовать написать собственный поставщик LINQ.Это очень сложно.Но если вы хотите попробовать это в любом случае, я бы посоветовал вам взглянуть на эту серию блогов, которая в основном описывает, как можно реализовать что-то вроде LINQ to SQL: http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx Я пишу серию, в которой описывается, какой типвыражения, которые ваш провайдер должен поддерживать, чтобы он работал с WCF Data Services.Это также может пригодиться: http://blogs.msdn.com/b/vitek/archive/2010/02/25/data-services-expressions-part-1-intro.aspx Обратите внимание, что вы можете написать только часть провайдера самостоятельно.Например, вы можете заниматься фильтрацией и оставлять сложные проекции / расширения вплоть до LINQ to Objects.Такой подход может немного облегчить реализацию вашего провайдера.

0 голосов
/ 28 июня 2010

Хорошо, вот что у меня есть.Единственная проблема заключается в том, что весь запрос должен выполняться в памяти:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...