0

我正在从事一个项目,我正在从现有系统中逐步淘汰实体框架。

我有

public List<GSP> GetOwnAirline()
        { 
            var res = from own in entity.GSP where own.Description == "Own Airline" select own;
            return res.ToList();
        }

为了绕过这个我做了

   public List<GSP> GetOwnAirline()
        {

            string get_ = "SELECT * FROM " + Adm.schema_ + "Adm.GSP WHERE Description = 'Own Airline'";
            ccs = new SqlConnection(Adm.COnnectionString);
            //convey transaction to db
            cmd = ccs.CreateCommand();
            ccs.Open();
            cmd.CommandText = get_;
            var res =cmd.ExecuteScalar();
            ccs.Close();

            return res.ToList();
        }

但是.ToList 在这种情况下似乎没有被识别。我哪里做错了伙计们?

4

4 回答 4

2

ExecuteScalar 返回一个标量 - 就像一个整数值。它不能转换为列表。

如果您使用的是 Ado.Net,则必须返回 DataTable 或 DataReader 才能获得结果。没有办法直接返回 List。

于 2013-09-19T04:58:12.850 回答
0

您的代码几乎没有问题。

  1. ExecuteScalar 返回 TGH 指出的单个值。
  2. 基本上,当您有某种 Array 或 IEnumerable 时使用 ToList。因为,在你的情况下,它是一个单一的 int 值,所以它不能在这里应用。
  3. 您可以在此处使用 ExecuteReader 来实现您的目标。
于 2013-09-19T05:05:57.827 回答
0

尝试这个:

    public List<GSP> GetOwnAirline()
    {
        List<GSP> lstGSP = new List<GSP>();
        using (ccs = new SqlConnection(Adm.COnnectionString))
        {
            string get_ = "SELECT * FROM " + Adm.schema_ + "Adm.GSP WHERE Description = 'Own Airline'";
            using (SqlCommand cmd = new SqlCommand(get_, ccs))
            {

                ccs.Open();
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                while (rdr.Read())
                {
                    GSP objGSP = new GSP();
                    Fill(objGSP, rdr);//method
                    lstGSP.Add(objGSP);
                }
                ccs.Close();
            }
        }

        return lstGSP;
    }



public static void Fill(object LogicObject, System.Data.SqlClient.SqlDataReader SqlDataReader)
        {
            Dictionary<string, PropertyInfo> props = new Dictionary<string, PropertyInfo>();
            foreach (PropertyInfo p in LogicObject.GetType().GetProperties())
                props.Add(p.Name, p);
            //foreach (System.Data.DataColumn col in Row.Table.Columns)

            for (int i = 0; i < SqlDataReader.FieldCount; i++)
            {
                string name = SqlDataReader.GetName(i);
                if (SqlDataReader[name] != DBNull.Value && props.ContainsKey(name))
                {
                    object item = SqlDataReader[name];
                    PropertyInfo p = props[name];
                    if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                    {
                        if (p.PropertyType != SqlDataReader.GetFieldType(i))
                            item = Convert.ChangeType(item, p.PropertyType.GetGenericArguments()[0]);

                    }
                    else
                    {
                        if (p.PropertyType != SqlDataReader.GetFieldType(i))
                            item = Convert.ChangeType(item, p.PropertyType);
                    }

                    p.SetValue(LogicObject, item, null);
                }

            }
        }
于 2013-09-19T05:09:08.970 回答
0

执行标量将返回您的标量。因此,您必须创建 GSP 类型的对象并添加到列表中。另一种方法是

public List<GSP> GetOwnAirline()
    {

        string get_ = "SELECT * FROM " + Adm.schema_ + "Adm.GSP WHERE Description = 'Own Airline'";
        ccs = new SqlConnection(Adm.COnnectionString);
        //convey transaction to db
        cmd = ccs.CreateCommand();
        ccs.Open();
        cmd.CommandText = get_;
        var res =cmd.ExecuteScalar();
        ccs.Close();
        List<GSP> gsp = new List<GSP>();
        GSP temp = new GSP();
        temp.PropertyName = res;
        gsp.Add(temp);
        return gsp;
    }
于 2013-09-19T05:09:20.590 回答