创建一个泛型类以返回一个表

本文关键字:一个 返回 泛型类 创建 | 更新日期: 2023-09-27 18:00:05

我正在尝试创建一个泛型类,在那里我可以传递两个表并返回第一个表。这两个变量是字符串值,用于连接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>();
    }

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

创建一个泛型类以返回一个表

也许你应该试试这样的东西:

   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;
    }

注意属性后面的.GetValue(table1,null)

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

所以我担心这永远不会奏效。但也许你可以按照这里的建议来做:如何创建一个动态LINQ连接扩展方法。

感谢您的输入。在深入研究了这个问题之后,我决定退一步,重新开始思考这是否是我试图实现的正确解决方案,以及它是否有益。