我有一个班级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
{
}
我的问题是:
如何将两个单独的列表添加到单个对象中?
如果我在GetSearchFilter对象中添加一个列表,我会收到错误:
无法将类型隐式转换为
System.Collection.Generic.List
到System.Namespace.GetSearchFilterResult()
方法。
如何解决此错误?
答案 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");