使用Linq和Extension方法更新表

时间:2010-01-13 21:44:38

标签: c# linq-to-sql

当我尝试使用以下代码更新表时,我收到错误消息

“无法创建变量类型'T'的实例,因为它没有new()约束”

如何创建新实例并更新数据库中的数据。

   IEnumerable<BookData> bookData = GetBookData(...);

   BookDataContext bookDB = new BookDataContext ();

   bookDB.UpdateTable<MCDB.BookTable>(bookDB.BookTable,bookData);



class BookTable
{
    public string bookName { get; set; }
    public string  authorName { get; set; }
}

扩展方法

 public static void UpdateTable<T>(this DataContext context, Table<T> tbl, IEnumerable<BookData> data)
    where T : class
    {
        foreach (var item in data)
        {
            context.GetTable<T>().InsertOnSubmit(new T());
            // Error in above statement 

             // I want to do something like this
             context.GetTable<T>().InsertOnSubmit(new T
                {
                    bName = item.bookName
                    aName = item.authorName,
                });
         }
         context.SubmitChanges();
    }

PS:我知道另一种方式,但我想使用扩展方法

更新表
using ( BookDataContext bookDB = new BookDataContext ())
{
  //code 
}

由于

2 个答案:

答案 0 :(得分:3)

您是否尝试过添加new constraint

where T : class, new()

答案 1 :(得分:3)

添加constraint where T : new()

public static void UpdateTable<T>(
    this DataContext context, Table<T> tbl,
    IEnumerable<BookData> data
) where T : class, new() {
    // details
}

请注意,T不能是抽象的,new约束必须是列出的最后一个约束。

哇,刚才注意到了这一点:

context.GetTable<T>().InsertOnSubmit(new T
    {
        bName = item.bookName
        aName = item.authorName,
    }
);

除非您向T添加约束,否则您无法逃避这一点,以便编译器知道T具有名为bNameaName的属性。至少您需要指定

where T : BookData, new()

其中BookData是一个定义了这些属性的类。这将指定TBookData或派生自BookData,并且它具有公共无参数构造函数。在这种情况下,您可以取消约束where T : class。或者,您可以指定

where T : IBookData, new()

其中IBookData是定义您正在使用的两个属性的接口。此约束指定T是实现IBookData的类型,并且它具有公共无参数构造函数。

鉴于此,我不明白为什么你这样做。