2013-02-06 22 views
1

我正在使用泛型来执行一些基本的插入/更新/使用linq2sql从数据库中进行选择。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; 
    } 
} 

回答

1

你必须使用Where,不Select

Select将N个项目转换为N个新项目,它不会过滤。
Where这样做。

return table.Where(t => t.GetType().GetProperty(pk).GetValue(t, null) 
         .Equals(value)) 
      .ToList(); 
+0

我已更改我的代码以匹配上面。但现在我得到一个异常说明:方法'System.Reflection.PropertyInfo GetProperty(System.String)'没有支持转换为SQL –