如何使用linq查询对象

时间:2018-09-20 08:24:18

标签: c# linq

我想通过使用变量来动态获取表名,但是当我将该表放回原位时,无法使用LINQ查询它。

第一步:我通过使用参数获取表名

var tableName = GetTable("Customer");

第二步:

  public static object GetTable(string tblName)
    {
        ALLDBEntities db = new ALLDBEntities();

        var table = db.GetType().GetProperty(tblName).GetValue(db) as IEnumerable;

        return table;
    }

这是我想要实现的

public List<Records> GetNonDuplicateRecords(string tableName)
      {

          ThreeEntities threeentities = new ThreeEntities();

          List<Records> recs = (from p in threeentities.TableName "Should use this"

                                select new Records
                                {
                                    _claimNumber = p.ClaimNumber,
                                    _firstname = p.PatientFirstName,
                                    _lastname = p.PatientLastName,
                                    _client = p.Client
                                }).ToList<Records>();

          return recs;
      }

这将按预期返回我的表/数据库集,并强制转换为IEnumerable,但是当我尝试使用LINQ查询此数据集/表时,它不允许我

对此有任何帮助吗?

2 个答案:

答案 0 :(得分:0)

IEnumerable不会扩展LINQ内容。您必须使用通用的IEnumerable。由于您没有表格的类型,因此必须通过反射创建通用的IEnumerable类型

//编辑[21.09.2018]

请查看以下代码。

    static void Main(string[] args)
    {
        var records = GetNonDuplicateRecords("Records");
    }

    public static IQueryable<T> GetTable<T>(string tblName)
    {
        ALLDBEntities db = new ALLDBEntities();

        var table = db.GetType().GetProperty(tblName).GetValue(db) as List<T>;

        return table.AsQueryable();
    }


    public static List<Records> GetNonDuplicateRecords(string tableName)
    {
        List<Records> recs = (from p in GetTable<RecordTable>(tableName)

                            select new Records
                            {
                                _claimNumber = p.ClaimNumber,
                                _firstname = p.PatientFirstName,
                                _lastname = p.PatientLastName,
                                _client = p.Client
                            }).ToList<Records>();

        return recs;
    }

    public class Records
    {
        public object _claimNumber { get; set; }
        public object _firstname { get; internal set; }
        public object _lastname { get; internal set; }
        public object _client { get; internal set; }
    }

    public class RecordTable
    {
        public object ClaimNumber { get; set; }
        public object PatientFirstName { get; internal set; }
        public object PatientLastName { get; internal set; }
        public object Client { get; internal set; }
    }

    public class ALLDBEntities
    {
        public List<RecordTable> Records { get; set; } = new List<RecordTable>
        {
            new RecordTable{ClaimNumber = "asdadsasd"}
        };
    }

如果使用EF,则必须使用GetValue(db) as List而不是GetValue(db) as DbSet。我现在还不清楚是使用EF还是其他方法。

一些提示: 尽管您已经编辑了代码,但是我不清楚您正在处理哪些数据。在我看来Record不是您的数据库模型。如果正确,那么在使用EF + linq2sql时,您无法从数据库模型中选择“普通” C#类,除非您先调用ToList()或进行其他操作。 原因是您的选择必须转换为纯SQL,并且基础SQL提供程序jsut不知道如何用原始SQL表示select => new Record()

答案 1 :(得分:0)

使用此:

IEnumerable<object> tableName = (IEnumerable<object>)GetTable("Customer");

您必须转换从GetTable接收的对象。 在这种情况下,返回之前进行投射无济于事。