将对象转换为列表

时间:2015-11-25 09:56:00

标签: c# linq list object

我想将对象转换为myclass列表,该对象是从linq查询返回的。

object list = detailManager.GetMutabakatDetailListByMutabakat(oMutabakat, true);
List<CurrentAccount> accountList = ??

像这样的GetMutabakatDetailListByMutabakat方法;

public object GetMutabakatDetailListByMutabakat(Mutabakat mutabakat, bool Gonderen)
{
    var detayIdList = this.Context.MutabakatDetay.Where(s => s.MutabakatId == mutabakat.MutabakatId).Select(s => s.MutabakatDetayId).ToList();

    var CariEkstreList =         
        (from ekstre in this.Context.CariHesapEkstre
        join detay in this.Context.MutabakatDetay on ekstre.MutabakatDetayId equals detay.MutabakatDetayId
        where detayIdList.Contains(ekstre.MutabakatDetayId.Value) && ekstre.GonderenMukellefFirmaId == mutabakat.GonderenMukellefFirmaId
        select new 
        {
            MutabakatDetayId = ekstre.MutabakatDetayId,
            MutabakatVar = ekstre.MutabakatVar,
            AlanFirmaId = ekstre.AlanFirmaId,
            GonderenMukellefFirmaId = ekstre.GonderenMukellefFirmaId,
            KayitTarihi = ekstre.KayitTarihi,
            DonemYil = ekstre.DonemYil,
            DonemAy = ekstre.DonemAy,
            Degistirildi = ekstre.Degistirildi,
            CariHesapEkstreId = ekstre.CariHesapEkstreId,
            AktaranKullaniciId = ekstre.AktaranKullaniciId,
            AktarimId = ekstre.AktarimId,
            AktarimTarihi = ekstre.AktarimTarihi,
            BakiyeTur = ekstre.BakiyeTur,
            BelgeNo = ekstre.BelgeNo,
            BelgeTarihi = ekstre.BelgeTarihi,
            BelgeTur = ekstre.BelgeTur,
            IslemTarihi = ekstre.IslemTarihi,
            ParaBirimi = ekstre.ParaBirimi,
            TLTutar = ekstre.BakiyeTur == "B" ? ekstre.TLTutar * -1 : ekstre.TLTutar,
            Tutar = ekstre.BakiyeTur == "B" ? ekstre.Tutar * -1 : ekstre.Tutar
        }).ToList();

    return CariEkstreList;
}

3 个答案:

答案 0 :(得分:3)

取决于 list实际上是什么:

A)如果detailManager.GetMutabakatDetailListByMutabakat(oMutabakat, true)返回IEnumerable<CurrentAccount>,那么您所要做的就是添加.ToList()

   List<CurrentAccount> accountList = detailManager
     .GetMutabakatDetailListByMutabakat(oMutabakat, true)
     .ToList(); 

B)如果detailManager.GetMutabakatDetailListByMutabakat(oMutabakat, true)返回IEnumerable<SomeObject>SomeObject 可以投放CurrentAccount那么

   List<CurrentAccount> accountList = detailManager
     .GetMutabakatDetailListByMutabakat(oMutabakat, true)
     .OfType<CurrentAccount>()
     .ToList(); 

C)最后,在一般情况中,你必须实现.Select

   List<CurrentAccount> accountList = detailManager
     .GetMutabakatDetailListByMutabakat(oMutabakat, true)
     .Select(item => GetAccountFromItem(item)) //TODO: implement Select
     .ToList();

答案 1 :(得分:0)

我可以说几件事,

您的方法GetMutabakatDetailListByMutabakat会返回什么?它必须是object吗?

顾名思义 - 如果方法名称为Get...List,我希望它返回一个列表,而不是一个对象。如果可以的话,首先改变那种行为然后就可以了。

如果该方法是由其他人编写的(您无法更改行为),那么您应该像其他人建议的那样使用强制转换操作,但只有当底层对象的类型为List<CurrentAccount>时才能执行此操作

如果底层对象甚至不是List<CurrentAccount>类型,那么你应该学习对象结构是什么(另一个类,匿名对象或动态)然后我们可以解决一些问题。

更新后

通过更新您的问题,我可以看到您正在返回一个匿名对象列表。但实际上不是CurrentAccount吗?

因此,如果您选择以下内容:

public List<CariHesapEkstre> GetMutabakatDetailListByMutabakat ( Mutabakat mutabakat, bool Gonderen )
{
    var detayIdList = this.Context.MutabakatDetay.Where(s => s.MutabakatId == mutabakat.MutabakatId).Select(s => s.MutabakatDetayId).ToList();

    var CariEkstreList =         
        ( from ekstre in this.Context.CariHesapEkstre
            join detay in this.Context.MutabakatDetay on ekstre.MutabakatDetayId equals detay.MutabakatDetayId
            where detayIdList.Contains(ekstre.MutabakatDetayId.Value) && ekstre.GonderenMukellefFirmaId == mutabakat.GonderenMukellefFirmaId

            /// here you only need to use object initializer for CariHesapEkstre like just below
            select new CariHesapEkstre
            {
                MutabakatDetayId = ekstre.MutabakatDetayId,
                MutabakatVar = ekstre.MutabakatVar,
                ...
                Tutar = ekstre.BakiyeTur == "B" ? ekstre.Tutar * -1 : ekstre.Tutar
            } ).ToList();

    return CariEkstreList;
}

上次更新

我知道你要做什么,你想要一种方法来为你做好工作。因此,您可以查看名为automapper的此工具。它做你想做的事。但是,对你的代码来说,这仍然是一项艰苦的工作。

但是如果您只是想将对象转换为列表,则可以使用下面的代码。

    public List<CariHesapEkstre> ConvertToDesiredType ( object list )
    {
        return ( (IEnumerable<dynamic>)list ).Select(item => new CariHesapEkstre
        {
            MutabakatDetayId = item.MutabakatDetayId,
            MutabakatVar = item.MutabakatVar,
            ...
        }).ToList();
    }

答案 2 :(得分:0)

谢谢大家,我使用reflaction解决了我的问题。 首先,对象转换为IList

List<CariHesapEkstre> senderExtractList = GetExtractList((IList)detayManager.GetMutabakatDetayListByMutabakat(oMutabakat, true));
private List<CariHesapEkstre> GetExtractList ( IList tempList )
{
    List<CariHesapEkstre> returnList = new List<CariHesapEkstre>();

    foreach ( var item in tempList )
    {
        CariHesapEkstre extract = new CariHesapEkstre();
        foreach ( PropertyInfo prop in item.GetType().GetProperties() )
        {
            foreach ( PropertyInfo prop2 in extract.GetType().GetProperties() )
            {
                if ( prop2.Name == prop.Name )
                {
                    prop2.SetValue(extract, prop.GetValue(item));
                }
            }
        }

        returnList.Add(extract);
    }

    return returnList;
}