Откройте API-интерфейс javascript с помощью coffeescript

Недавно я начал использовать coffeescript, и мне было любопытно, каков «правильный» способ показать объект, который я создаю с помощью Coffeescript, другим страницам javascript. Допустимо ли поведение окна из-за функции обертывания coffeescripts. Мы успешно использовали этот дизайн со старым ObjectContext 4.0 в прошлом, но я хотел бы использовать новый API. Тот же подход также не работает с API 4.0 ObjectContext (протестирован с использованием сгенерированных сущностей POCO).

Примечание: я не думаю, что реалистично размещать сотни строк кода, но у меня есть образец решения с ASP.NET MVC 3 проект с использованием SQL Server CE 4.0 и проект базового модульного тестирования, демонстрирующий результаты различных подходов, которые можно загрузить или отправить по электронной почте, если это поможет.


Интерфейс репозитория, который я использую, очень прост:

public interface IRepository<TEntity> : IDisposable where TEntity : class, ITestEntity
{
    TEntity GetById(int id);
    IQueryable<TEntity> Query();
    void Add(TEntity entity);
    void Remove(TEntity entity);
    void Attach(TEntity entity);
}

Контекстный интерфейс даже больше просто:

public interface ITestDbContext : IDisposable
{
    IDbSet<TEntity> Set<TEntity>() where T: class, ITestEntity;
    void Commit();
}

Вот пример использования, которое не работает, с использованием интерфейсов для репозитория и экземпляров контекста:

using (ITestDbContext context = new TestDbContext())
using (IRepository<Table1> table1Repository = new Repository<Table1>(context))
using (IRepository<Table2> table2Repository = new Repository<Table2>(context))
{
    // throws a NotSupportedException
    var results = table1Repository.Query()
        .Select(t1 => new
        {
            T1 = t1,
            HasMatches = table2Repository.Query()
                .Any(t2 => t2.Table1Id == t1.Id)
        })
        .ToList();
}

Приведенный выше код представляет собой подход, который я хотел бы использовать. В конечном итоге будут введены конкретные классы.

Не обращайте внимания на тот факт, что есть способы лучше написать этот конкретный запрос, чем использование подзапроса. Я намеренно упростил код, чтобы сосредоточиться на реальной проблеме: EF не будет переводить запрос.

Сохранение результата метода Query () "внутреннего" репозитория в локальной переменной действительно работает, но не идеально, как вы 'Придется не забывать делать это все время.

using (ITestDbContext context = new TestDbContext())
using (IRepository<Table1> table1Repository = new Repository<Table1>(context))
using (IRepository<Table2> table2Repository = new Repository<Table2>(context))
{
    var table2RepositoryQuery = table2Repository.Query();

    // this time, it works!
    var results = table1Repository.Query()
        .Select(t1 => new
        {
            T1 = t1,
            HasMatches = table2RepositoryQuery
                .Any(t2 => t2.Table1Id == t1.Id)
        })
        .ToList();
}

Я также заметил, что некоторые другие подходы не работают или работают успешно, например, игнорирование репозиториев и вызов TestDbContext.Set () работает, но ITestDbContext.Set () не будет переводиться. Изменение определения ITestDbContext.Set () для возврата DbSet вместо IDbSet по-прежнему не удается.

Изменить:
Я не думаю, что это возможно без некоторого перехвата и перевода запросов. Если я найду решение в будущем, обязательно поделюсь им.

10
задан GWB 13 December 2011 в 21:44
поделиться