Проблема приведения LINQ-to-entity - PullRequest
1 голос
/ 19 ноября 2011

Я пытаюсь отфильтровать запрос LINQ-to-entity обычным способом, но постоянно получаю сообщение об ошибке. Вот кусок кода:

private IQueryable<T> FilterDeletedEntities<T>(IQueryable<T> entities)
{
    if (typeof(IDeletable).IsAssignableFrom(typeof(T)))
    {
        var deletableEntities = (IQueryable<IDeletable>)entities;
        deletableEntities = deletableEntities.Where(entity => !entity.Deleted);
        entities = (IQueryable<T>)deletableEntities;
    }
    return entities;
}

По сути, я пытаюсь отфильтровать удаленные объекты (т. Е. Поле «Удалено» равно «истина»), если и только если объект является IDeletable (т. Е. У него есть поле «Удалено»). Проблема в том, что я не могу привести IQueryable обратно к IQueryable .

Есть идеи как это исправить? И прежде чем вы спросите: да, этот метод имеет , чтобы быть универсальным.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Я смог решить мою проблему следующим образом:

private IQueryable<T> FilterDeletedEntities<T>(IQueryable<T> entities)
{
    if (typeof(IDeletable).IsAssignableFrom(typeof(T)))
    {
        var deletableEntities = (IQueryable<IDeletable>)entities;
        return deletableEntities.Where(entity => !entity.Deleted).Cast<T>();
    }
    return entities;
}

Спасибо tvanfosson за вдохновение.

1 голос
/ 19 ноября 2011

Но вы можете использовать Cast<T>() для его преобразования.

 entities = deletableEntities.Cast<T>();

Вы также можете использовать его для преобразования в IDeletable, например,

private IEnumerable<T> FilterDeletedEntities<T>(IQueryable<T> entities)
{
    if (typeof(IDeletable).IsAssignableFrom(typeof(T)))
    {
        return entities.ToList()
                       .Cast<IDeletable>()
                       .Where( e => !e.Deleted )
                       .Cast<T>();
    }
    return entities.ToList();
}
0 голосов
/ 20 ноября 2011

Если вы можете предположить, что никому не нужно будет вызывать этот метод с T, который не реализует IDeletable, вы можете ограничить T:

private IQueryable<T> FilterDeletedEntities<T>(IQueryable<T> entities) where T : IDeletable

В качестве бонуса вам не нужно ничего разыгрывать или использовать отражение для проверки на IDeletable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...