循环结构使用addwithValue持久化数据

时间:2010-07-04 10:43:15

标签: c# .net linq linq-to-sql

我的LINQ知识还可以。我需要一个循环或其他方法来完成ADO.NET方法(参见foreach循环)

public bool AccessProcess(string sp, ListDictionary ld, CommandType cmdType)
{
    SqlConnection con = new SqlConnection(
        WebConfigurationManager.ConnectionStrings["conn"].ToString());
    SqlCommand cmd = new SqlCommand(sp, con);
    try
    {
        con.Open();
        cmd.CommandType = cmdType;
        foreach (string ky in ld.Keys)
        {
            cmd.Parameters.AddWithValue(ky, ld[ky]);
        }
        cmd.ExecuteNonQuery();
    }
    finally
    {
        con.Dispose();
        cmd.Dispose();
    }
    return true;
}

我需要:

foreach (string ky in ld.Keys)
    yourObject.SetPropertyValue(ky, ld[ky]);

我该怎么做?我可以使用LINQ-to-SQL吗?

你能给出像

这样的明确样本吗?
using (var contex = new DataclassContext())
foreach (string ky in ld.Keys)
{
    contex.Parameters.AddWithValue(ky, ld[ky]);
}
contex.SubmitChanges();

1 个答案:

答案 0 :(得分:1)

Linq to SQL将数据类(通常称为“实体”)映射到SQL数据库表。

因此,首先您需要使用Linq-> SQL设计器为您生成这些数据类,以及一个DataContext对象,它将这些类映射到数据库或从数据库映射。

您通常在Visual Studio的Linq to SQL设计器UI中定义此映射。此UI允许您直观地编辑.dbml文件,并基本上定义CLR实体对象与支持SQL数据库表之间的映射。

See this MSDN article以获取如何将新的Linq添加到SQL类的示例。

定义此类后,可以创建此类的新实例及其属性值。这些属性值映射到SQL数据库表中的列。然后,将此对象传递给LINQ to SQL生成的DataContext类,以向数据库中的表添加新行。

所以,你会做这样的事情:

For a database table with columns "ColumnA", "ColumnB" and "ColumnC"

var myEntity = new EntityObject { ColumnA = "valueA", ColumnB = "valueB", "ColumnC" = "valueC" };
DataContext.InsertOnSubmit(myEntity);
DataContext.SubmitChanges();

这将使用指定的列值将新行插入数据库。

现在,如果您不想手动编写代码来写入ColumnA,ColumnB等,那么您可以使用反射来写入实体上的相应属性:

例如,使用实体实例'myEntity':

var properties = myEntity.GetType().GetProperties();

foreach (string ky in ld.Keys)
{
    var matchingProperty = properties.Where(p => p.Name.Equals(ky)).FirstOrDefault();
    if (matchingProperty != null)
    {
        matchingProperty.SetValue(myEntity, ld[ky], null);
    }
}

使用反射不能提供最佳性能,所以我想问为什么你甚至想要将一组键和值映射到linq-> sql实体,而不是直接在当​​前的代码中使用实体对象生成这些键/值对。