繁体   English   中英

在带有接口的LINQ to Sql数据上下文中使用delete - '接口未映射为表'

[英]Using delete on a LINQ to Sql Data Context with an Interface - 'Interface is not mapped as a table'

我的数据上下文中有三个实体继承了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()上进行切换,这有点乱。

谢谢!

解:

正如Marc所说,我在调用方法中使用了dynamic

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

您可以使用实际的T手动构建Expression吗? 未经测试(因为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 ,它将失败 - 在T上必须有明显的Key字段/属性。

然后:

var table = db.GetTable<T>();
var obj = table.SingleOrDefault(lambda);
if(obj != null) table.DeleteOnSubmit(obj);
db.SubmitChanges();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM