2013-02-19 95 views
0

我想创建一个泛型类,我可以传递两个表并返回第一个。这两个变量是我用来连接linq查询中的表的字符串值。我想返回的是一个IQueryable值,但它一直返回一个DataQuery值。创建泛型类来返回表

这结束在我的错误MVC视图失败 “方法 'System.Reflection.PropertyInfo的getProperty(System.String)' 有没有支持转换为SQL” 的

代码:

var result = GetTable<Table1, Table2>("Table1id", "Table2id"); 


    public virtual IQueryable<T> GetTable<T, A>(string table1Variable, 
             string table2Variable) 
                where T : class 
                where A : class 
    { 
     var table1 = entityDatabaseDC.GetTable<T>(); 
     var table2 = entityDatabaseDC.GetTable<A>(); 

     return from entity in table1.AsQueryable() 
       join entity2 in table2 on entity.GetType().GetProperty(table1Variable) 
             equals entity2.GetType().GetProperty(table2Variable) 
       select entity; 

    } 

它适用于单个表格:

 var result = repository.GetTable<Table1>(); 

    public virtual IQueryable<T> GetTable<T>() where T : class 
    { 
      return entityDatabaseDC.GetTable<T>(); 
    } 

我想知道我所尝试的是否可能。

+0

我想你想使用动态LINQ。 – 2013-02-19 18:21:41

+0

只是一句话:如果你想要一些非常松散的类型,使用Linq-2-sql有什么好处。 – Pleun 2013-02-20 10:01:06

回答

0

感谢您的意见。在仔细研究这个问题后,我决定退后一步,回到制图板考虑这是否是我想要实现的正确解决方案,以及它是否有益。

0

也许你应该尝试这样:属性后

public virtual IQueryable<T> GetTable<T, A>(string table1Variable, 
             string table2Variable) 
                where T : class 
                where A : class 
    { 
     var table1 = entityDatabaseDC.GetTable<T>(); 
     var table2 = entityDatabaseDC.GetTable<A>(); 

     return from entity in table1.AsQueryable() 
       join entity2 in table2 on 
       entity.GetType().GetProperty(table1Variable).GetValue(table1,null) 
             equals 
       entity2.GetType().GetProperty(table2Variable).GetValue(table2,null) 
       select entity; 

    } 

NOTIS的.GetValue(table1,null)

0

问题是linq-to-sql试图将连接表达式(以及整个语句)转换为SQL。当然,没有办法从SQL语句中调用GetProperty

所以我恐怕这是永远不会工作。但也许你可以这样做:How to create a dynamic LINQ join extension method