【问题标题】:converting/Casting ISingleResult - List values to my class without Looping转换/铸造 ISingleResult - 将值列出到我的类而不循环
【发布时间】:2011-02-11 17:36:47
【问题描述】:

我有一个这样的 DataContract:

[Serializable]
[DataContract]
public class Employee: IEmployee
{
    public Employee();

    [DataMember]
    public string EmpID { get; set; }
    [DataMember]
    public List<EmpSalaryDetail> EmpSalaryDetails { get; set; }
    [DataMember]
    public List<EmpPersonalDetail> EmpPersonalDetails { get; set; }
}
[DataContract]
public class EmpSalaryDetail: IEmpSalaryDetail
{
    public EmpSalaryDetail();

    [DataMember]
    public string EmpID { get; set; }
    [DataMember]
    public int GrossSal { get; set; }
}
public class EmpPersonalDetail: IEmpPersonalDetail
{
    public EmpPersonalDetail();

    [DataMember]
    public string EmpID { get; set; }
    [DataMember]
    public string EmpName { get; set; }
}

我在我的 c# 应用程序中使用 Linq to Sql 来创建以下代码:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetEmployeeDetails")]
public ISingleResult<GetEmployeeDetailsResult> GetEmployeeDetails([global::System.Data.Linq.Mapping.ParameterAttribute(Name="EmpId", DbType="NVarChar(32)")] string empID)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)   
(MethodInfo.GetCurrentMethod())), empID);
return ((ISingleResult<GetEmployeeDetailsResult>)(result.ReturnValue));
}

我将 GetEmployeeDetailsResult 的结果转换为一个列表,我得到这样的结果:

EmpID GrossSal EmpName

a11 3560 拉吉

a12 9760 库马尔

a13 5670 塞尔瓦

a14 3080 乔

a15 8900 帧

a16 5500 拉维

a17 7000 曼尼

我想将此平面列表映射回 Employee 类的对象。我不想遍历列表并为每个类创建对象。

有没有其他方法,比如再次编写 linq 查询或其他真正聪明的方法。

请给你建议。

【问题讨论】:

  • 仅供参考,循环遍历列表并创建对象正是 linq 解决方案所要做的。
  • @asawyer:但是 LINQ 的重点是让代码更具声明性和更少的命令性,这样我们就可以说“将此列表投影到 Employee 的列表中;我不在乎你如何做吧,做吧。” LINQ 让我们摆脱了无助于表达代码意图的顾虑。
  • @Jason 我理解并同意,只是向 OP 指出。
  • @jeffamaphone:另一个问题是这个问题的重复;这个是按时间顺序排在第一位的。

标签: c#


【解决方案1】:

这样的事情应该可以解决问题。您没有给我们GetEmployeeDetailsResult 的定义,因此您可能需要根据GetEmployeeDetailsResult.EmpIDGetEmployeeDetailsResult.GrossSal 的类型对Convert.ToInt32 进行一些调用:

var employees = 
    result.Select(x => new Employee {
        EmpID = x.EmpID,
        EmpSalaryDetails = new List<EmpSalaryDetail> {
            new EmpSalaryDetail { 
                EmpID = x.EmpID,
                GrossSal = x.GrossSal
            }
        },
        EmpPersonalDetails = new List<EmpPersonalDetail> {
            new EmpPersonalDetail {
                EmpID = x.EmpID,
               EmpName = x.EmpName
            }
        }
    );

【讨论】:

  • 感谢您的建议。我试过这个,但员工似乎是空的。如何处理?
  • @Joseph:如果result 不是null,则employees 不是null。保证。当然,如果resultnull,那么上面无论如何都会炸弹。
  • 我收到此错误....无法将“WhereSelectListIterator`2[ExternalInterface.GetEmployeeDetailsResult,CommonDataContracts.Employee]”类型的对象转换为“CommonDataContracts.Employee”类型。
  • @Joseph:嗯,这与说它是null 非常不同。请注意,employees 不是Employee。它是Employee 的序列。尝试将Employee 序列转换为单个Employee 是没有意义的(您可以将与您一起工作的所有人按字母顺序排列的列表转换为公司中的单个员工吗?)
  • 我给了你一个错误的例子,所以我问了一个新的“”-“将 ISingleResult 列表值转换为我的类而不循环”,并给出了正确的例子。如果您有任何想法,请告诉我。谢谢
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多