我的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();
答案 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实体,而不是直接在当前的代码中使用实体对象生成这些键/值对。