Использование delete в контексте данных LINQ to Sql с интерфейсом - «Интерфейс не отображается как таблица» - PullRequest
4 голосов
/ 22 августа 2011

В моем контексте данных есть три объекта, которые наследуют IFileData, но мне нужен только один метод удаления. Как этого достичь?

Приведенный ниже код выдает ошибку The type "IFileData" is not mapped as a Table.

    public void ImageDelete<T>(T instance) where T : class, IFileData
    {
        using (var db = this.CreateDataContext())
        {
            db.GetTable<T>().DeleteOnSubmit(instance);
            db.SubmitChanges();
        }
    }

Единственное решение, которое у меня есть, это переключение на .GetType(), что немного грязно.

Спасибо!

Решение:

Как упоминал Марк, я использовал dynamic в методе вызова:

ImageDelete((dynamic)(instance as IFileData));

1 Ответ

4 голосов
/ 22 августа 2011

Вы могли бы построить Expression вручную, используя фактический T? Не проверено (так как Delete не существует?), Но что-то вроде:

var param = Expression.Parameter(typeof(T), "x");
var lambda = Expression.Lambda<Func<T, bool>>(
    Expression.Equal(
       Expression.Property(param, "Key"),
       Expression.Constant(instance.Key)
    ), param);

Это тогда не привязано к IFileData, но к T. Однако произойдет сбой, если IFileData.Key реализован через явную реализацию интерфейса - должно быть очевидное поле / свойство Key в T.

Тогда:

var table = db.GetTable<T>();
var obj = table.SingleOrDefault(lambda);
if(obj != null) table.DeleteOnSubmit(obj);
db.SubmitChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...