Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ-to-Sql数据上下文上使用delete,接口为&x27;接口未映射为表';_C#_Linq_Linq To Sql_Generics - Fatal编程技术网

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();