C# 在LINQ-to-Sql数据上下文上使用delete,接口为&x27;接口未映射为表';
我的数据上下文中有三个实体继承了C# 在LINQ-to-Sql数据上下文上使用delete,接口为&x27;接口未映射为表';,c#,linq,linq-to-sql,generics,C#,Linq,Linq To Sql,Generics,我的数据上下文中有三个实体继承了IFileData,但我只需要一个delete方法。如何做到这一点 下面的代码给出了错误类型“IFileData”未映射为表 public void ImageDelete<T>(T instance) where T : class, IFileData { using (var db = this.CreateDataContext()) { db.GetTable<T&
IFileData
,但我只需要一个delete方法。如何做到这一点
下面的代码给出了错误类型“IFileData”未映射为表
public void ImageDelete<T>(T instance) where T : class, IFileData
{
using (var db = this.CreateDataContext())
{
db.GetTable<T>().DeleteOnSubmit(instance);
db.SubmitChanges();
}
}
public void ImageDelete(T实例),其中T:class,IFileData
{
使用(var db=this.CreateDataContext())
{
db.GetTable().DeleteOnSubmit(实例);
db.SubmitChanges();
}
}
到目前为止,我唯一的解决方案是在有点混乱的.GetType()
上进行切换
谢谢
解决方案:
正如Marc提到的,我在调用方法中使用了dynamic
:
ImageDelete((动态)(实例为IFileData))
您可以使用实际的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);
谢谢你的回复。代码没有在第二个表达式(Expression
)上编译,它说“此时类名无效。”
。感谢您的回复。代码没有在第二个表达式(Expression
)上编译,它说“类名此时无效。”
。delete扩展方法来自CodeSmith,它基本上将lambda转换为SQL并执行批删除。我将其更改为使用deleteosubmit(实例)
。(显然我花了超过5分钟编辑我的评论:()很好,但是我怎么处理我的lambda?我对表达式树不太熟悉……(我也把问题改了一点,你有没有可能更新答案?:)谢谢你的帮助,Marc,我想这里有点误解,问题是T
属于IFileData
类型,因此实际上是行db.GetTable()
引发了类型“IFileData”未映射为表的异常,然后使用正确的T
;p如果不知道,有两个选项:1:使用instance.GetType()
和MakeGenericMethod
和反射来获得正确的方法-非常难看;或2:在4.0中,在调用代码中,使用动态;i、 e.使用ImageDelete((动态)obj)
代替ImageDelete(obj)
。然后在运行时使用实际的T
。
var table = db.GetTable<T>();
var obj = table.SingleOrDefault(lambda);
if(obj != null) table.DeleteOnSubmit(obj);
db.SubmitChanges();