无法隐式转换类型' System.Collections.Generic.List<>'方法

时间:2014-10-13 16:59:55

标签: c# wcf

我有一个班级GetSearchFilters_Results,它有两个列表:

    [DataContract]
    public class GetSearchFilters_Results
    {
        public List<ElementList> ElementList{ get; set; }
        public List<Managers> ManagerList { get; set; }
    }

我有一个名为Service.cs的文件:

    public GetSearchFilters_Results GetSearchFilters(string DomainID)
    {
        //Main List return List 
        //List<GetSearchFilters_Results> SearchFilterResults = new List<GetSearchFilters_Results>();

        //Class
        GetSearchFilters_Results GSF = new GetSearchFilters_Results();

        string cs = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;
        try
        {
            using (SqlConnection con = new SqlConnection(cs))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("spCPMapp_GetSearchFilters", con);
                cmd.Parameters.AddWithValue("@Domain_Id", DomainID);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter sqlDa = new SqlDataAdapter(cmd);
                DataSet Ds = new DataSet();
                sqlDa.Fill(Ds);

                DataTable DtWBS = new DataTable();
                DataTable DTManager = new DataTable();

                sqlDa.Fill(Ds);

                DtWBS = Ds.Tables[0];
                DTManager = Ds.Tables[1];

                //Get WBS Elements List
                if (DtWBS.Rows.Count > 0)
                {
                    List<ElementList> ElementList= new List<ElementList>();
                    for (int i = 0; i < DtWBS.Rows.Count; i++)
                    {
                        ElementList wbs = new ElementList();

                        wbs.ProjectID = Convert.ToInt32(DtWBS.Rows[i]["Project_ID"].ToString());
                        wbs.WBSElementName = DtWBS.Rows[i]["WBSShort"].ToString();

                        WBSElementsList.Add(wbs);
                        //GSF.WBSElementsList.Add(wbs);
                    }
                    GSF.WBSElementsList = WBSElementsList;
                    //SearchFilterResults.Add(GSF);
                }

                //Get Managers List Start
                if (DTManager.Rows.Count > 0)
                {
                    List<Managers> ManagersList = new List<Managers>();
                    for (int i = 0; i < DTManager.Rows.Count; i++)
                    {
                        Managers Mgr = new Managers();

                        Mgr.TimeSheetID = Convert.ToInt32(DTManager.Rows[i]["Project_ID"].ToString());
                        Mgr.ManagerName = DTManager.Rows[i]["Manager"].ToString();

                        //GSF.ManagerList.Add(Mgr);
                        ManagersList.Add(Mgr);
                    }
                    GSF.ManagerList = ManagersList;
                }
                //Manager List End 

            }//Using End 

            //SearchFilterResults.Add(GSF);
        }
        catch (SqlException sqlEx)
        {
            sqlEx.ToString();

        }
        catch (FaultException ex)
        {
            ex.ToString();
        }
        catch (OverflowException e)
        {
            e.ToString();
        }
        return GSF.ManagerList;  // I am getting error, how to add two lists into single objectGetSearchFilters_Results

    }

另一类元素:

 [DataContract]
 public class Elements
 {

 }

我的问题是:

  1. 如何将两个单独的列表添加到单个对象中?

  2. 如果我在GetSearchFilter对象中添加一个列表,我会收到错误:

      

    无法将类型隐式转换为System.Collection.Generic.ListSystem.Namespace.GetSearchFilterResult()方法。

    如何解决此错误?

4 个答案:

答案 0 :(得分:2)

您的问题是,您要返回的是List而不是GetSearchFilter_Results

如果您打算返回一个GetSearchFilter_Results对象,如函数标题所示,您可以将最后一行更改为:

return GSF;

编辑和旁注:

您询问了如何将两个列表一起添加。假设列表属于同一个对象,您可以使用AddRange()函数,如下所示:

List<string> stringListA = new List<string>();
List<string> stringListB = new List<string>();
stringListA.AddRange(stringListB); // stringListA now holds the elements from both A and B.

另外一个补充,希望我不会添加太多

我也注意到你并没有区分你如何捕获每个例外。我不知道你的案例需要什么,但你可以通过简单地说:

来消除几行代码。
catch(Exception e)
{
    e.ToString();
}

而不是多个catch语句都做同样的事情。

答案 1 :(得分:0)

您需要此功能     GetSearchFilters返回

GetSearchFilters_Results 

但你真正回归的是

GSF.ManagerList

类型

List<Managers> ManagerList

那是你的错误。无论如何,对于问题的第1部分,您可以创建一个包含两个数据成员的类,每个成员都是一个列表,然后在构造函数或单独的函数中,为列表传递两个参数:

public Class TwoListsClass
{
List <type1> list1;
List <type2> list2;

    public TwoListsClass (List <type1> list1, List <type2> list2)
    {
        this.list1 = list1;
        this.list2 = list2; 
    }

}

然后,当您完成对两个列表的评估时,您可以调用构造函数或您编写的函数。

答案 2 :(得分:0)

你为此发布了大量代码。也许尝试抽象出一些逻辑,以便更清晰,更容易阅读?

您的问题是,您试图将List<ManagerList>放入GetSearchFilters_Results的回复中。虽然ManagerList的列表是GetSearchFilters_Results的属性,但它们不能被“隐式转换”为错误状态。

您可能希望这样做:

[DataContract]
public class GetSearchFilters_Results
{
    public List<ElementList> ElementList{ get; set; }
    public List<Managers> ManagerList { get; set; }

    public GetSearchFilters_Results
    {
        ElementList = new List<ElementList>();
        ManagerList = new List<ManagerList>();
    }

    public GetSearchFilters_Results Execute()
    {
        this.ELementList = this.GetElementList();
        this.ManagerList = this.GetManagerList();

        return this;
    }

    public List<ElementList> GetElementList()
    {
        List<ElementList> list = new List<ElementList>();

        // Get list information from db 

        return list;
    }

    public List<ManagerList> GetManagerList()
    {
        List<ManagerList> list = new List<ManagerList>();

        // Get list information from db 

        return list;
    }
}

答案 3 :(得分:0)

哇,这是做旧事情的艰难方法....考虑一下:你已经有两种模式了。

public List<ElementList> ElementList{ get; set; }
public List<Managers> ManagerList { get; set; }

这告诉我可以从EF生成,这很好....

现在,在EF中有一个鲜为人知但非常酷的方法,如下所示:

    public List<MyType> QueryThis(ViewModel vm)
    {
        using (var db = new MyEntities()){
        var parms = GetParms(vm);
        var query = Resources.QueryStrings.MyQuery;
        var stuff = db.Database.SqlQuery<MyType>(query, parms);
        return stuff.ToList();
    }

强调传递给SQLQuery的类型......

所以你真正需要做的就是提供一个新模型,它结合了你想要的所有字段,SQL会自动为你填充它们。 MyType类将包含两个模型的所有字段。 SQL还知道如何填充基类,以便您可以从一个类继承并只输入较小类的字段。不再解析甚至多次击中数据库。只需调整查询即可一次性获得所需内容。

从这一点开始的所有过滤都可以使用LINQ来完成...它是使用ADO.NET断开模式概念的新方法。当你深入挖掘这一点时,你会发现存储库,但那是另一天。

var filtered = MyTypeList.Where(p=>p.ManagerName == "SomeValue");
var filtered = MyTypeList.Where(p=>p.ElementType == "Somevalue");