如何使该方法用一个列表中的不同表和字段中的值填充列表?

时间:2019-03-22 14:29:48

标签: c# entity-framework

我想制作一种方法,用来自各个表和字段的行填充lst_List列表。
代码的初始版本:

cntDB = new ContextDB();
 List<List<string>> lst_List = new List<List<string>>();
 public void Method_2(string nameTable, string nameField)
        {
            var phones = cntDB.Database.ExecuteSqlCommand("SELECT " + nameField + " FROM " + nameTable); // +-
            lst_List.AddRange(phones.ToList());
        }

如何使方法用一个列表中的不同表和字段中的值填充列表?

3 个答案:

答案 0 :(得分:2)

ExecuteSqlCommand返回一个int而不是结果集,并且主要用于非SELECT命令(例如INSERT,UPDATE,DELETE)。请改用SqlQuery

cntDB = new ContextDB();
 List<string> lst_List = new List<string>();
 public void Method_2(string nameTable, string nameField)
        {
            var lst_List = cntDB.Database.SqlQuery<string>("SELECT " + nameField + " FROM " + nameTable).ToList();
        }

您不会通过这种方式得到List<List<string>>,但是我看不到如何根据您的SQL语句从单个平面查询中填充该类型?

答案 1 :(得分:1)

如果我理解正确,那么您将根据给定的名称和表使用不同的条目填充列表。

鉴于您尝试使用的方法,我将创建一个类:

    private class DbTable
    {
        public string Name { get; set; }
        public List<string> Fields;
    }

现在,您可以修改您的方法以获取DbTable对象的List。

    public void Method_2(List<DbTable> tables)
    {
        foreach (var table in tables)
        {
            foreach (var field in table.Fields)
            {
                var phones = cntDB.Database.ExecuteSqlCommand("SELECT " + field + " FROM " + table.Name); // +-
                lst_List.AddRange(phones.ToList());
            }
        }
    }

您需要实例化要传递给方法的列表

        var tablesList = new List<DbTable>();
        var dbTable = new DbTable();
        dbTable.Name = "MyTableName";
        dbTable.Fields = new List<string>
        {
            "FirstField",
            "SecondField"
        };
        tablesList.Add(dbTable);

答案 2 :(得分:-1)

我认为使用LINQ会更容易:

var list = new List<List<string>>();
var FieldName1Rows = cntDB.TableName1.Select(x => x.FieldName1.ToString()).ToList();
list.Add(FieldName1Rows);
var FieldName2Rows = cntDB.TableName2.Select(x => x.FieldName2.ToString()).ToList();
list.Add(FieldName2Rows);