c# - 在具有接口(interface)的 LINQ to Sql 数据上下文上使用删除 - 'Interface is not mapped as a table'

标签 c# linq linq-to-sql generics

我的数据上下文中有三个继承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((动态)(实例为 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);

这不是绑定(bind)到 IFileData,而是绑定(bind)到 T。但是,如果 IFileData.Key 是通过显式接口(interface)实现实现的,它将失败 - T 上必须有一个明显的 Key 字段/属性。

然后:

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

关于c# - 在具有接口(interface)的 LINQ to Sql 数据上下文上使用删除 - 'Interface is not mapped as a table',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7143359/

相关文章:

c# - 是否存在为歧义语句返回解析林的 C# 解析器生成器?

.net - 如何强制 LINQ to SQL 将 .NET DateTime 作为 datetime2 传递?

c# - 从 LINQ 表达式中提取 sql 查询

c# - SQL Server 原子增量

C# 4.0 隐式类型动态对象

c# - VS.NET 默认为私有(private)类

c# - 变量改变...另一个变量?

c# - IEnumerable<TimeSpan> 的 Sum 方法扩展

vb.net - 动态 Linq 查询 - 如何构建 select 子句?

c# - 当通用不可用时尝试获取通用