我正在使用泛型来使用linq2sql从数据库中进行一些基本的插入/更新/选择。
我有以下内容并且我试图将其转换为接受列名和对象值以基于选择但我无法使其工作。
public static T SelectByID<T>(string id) where T : class
{
try
{
using (DataContext db = new DataContext(CHCGlobal.ConnectionString))
{
//get Table of type T
var table = db.GetTable<T>();
//get object mappings
MetaModel modelMap = table.Context.Mapping;
//get the data members for this type
ReadOnlyCollection<MetaDataMember> dataMembers = modelMap.GetMetaType(typeof(T)).DataMembers;
//find primary key
string pk = (dataMembers.Single<MetaDataMember>(m => m.IsPrimaryKey)).Name;
//return a single object with the id matching the pk field
return table.SingleOrDefault<T>(delegate (T t)
{
string memberId = t.GetType().GetProperty(pk).GetValue(t, null).ToString();
return memberId.ToString() == id.ToString();
});
}
}
catch (Exception)
{
throw;
}
}
这是我试图创建的功能,但我会卡在选择语句上。
public static List<T> SelectByKeyValue<T>(string id, object value) where T : class
{
try
{
using (DataContext db = new DataContext(CHCGlobal.ConnectionString))
{
//get Table of type T
var table = db.GetTable<T>();
//get object mappings
MetaModel modelMap = table.Context.Mapping;
//get the data members for this type
ReadOnlyCollection<MetaDataMember> dataMembers = modelMap.GetMetaType(typeof(T)).DataMembers;
//find key
string pk = (dataMembers.Single<MetaDataMember>(m => m.Name.Equals(id))).Name;
//NOT WORKING
return table.Select<T, T>(delegate (T t)
{
var memberID = t.GetType().GetProperty(pk).GetValue(t, null);
return memberID.Equals(value);
}).ToList<T>();
}
}
catch (Exception)
{
throw;
}
}
答案 0 :(得分:1)
您必须使用Where
,而不是Select
。
Select
将N个项目转换为N个新项目,但不会过滤
Where
就是这么做的。
return table.Where(t => t.GetType().GetProperty(pk).GetValue(t, null)
.Equals(value))
.ToList();