通过带有连接的动态linq对象循环

时间:2013-10-12 16:13:59

标签: c# linq

我有以下功能

 public List<Object> GetEventsForAdmin()
    {
        using (var dbEntities = new CapeledEntities())
        {
            return (from e in dbEntities.Events
                    join lnk in dbEntities.linkEventCategories on e.EventId equals lnk.EventId
                    join cat in dbEntities.Categories on lnk.CategoryId equals cat.CategoryId
                    orderby e.StartDateTime descending
                    select new { 
                                    e.EventId, 
                                    EventTitle =  e.Title,
                                    e.StartDateTime,
                                    e.Description, 
                                    CatTitle = cat.Title 
                   }
            ).ToList<Object>();
        }
    }

我正在使用

  var eventHelper = new BusinessLogic.DatabaseAccess.Helpers.BLEvents();
  foreach (var myEvent in eventHelper.GetEventsForAdmin())
  {
       txtTitle.text = myEvent.CatTitle;
       txtDescription.text = myEvent.description;
   }

但是找不到myEvent.CatTitle和myEvent.description argh

  }

3 个答案:

答案 0 :(得分:2)

更改

foreach (var myEvent in eventHelper.GetEventsForAdmin())

foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())

这应该允许您访问已被强制转换为对象的匿名类型的成员。

答案 1 :(得分:2)

我建议您创建一个简单的dynamicstruct,而不是使用class

class Event
{ 
    public int EventId;
    public string EventTitle;
    public DateTime StartDateTime;
    public string Description;
    public string CatTitle;
}

现在,您可以创建一个明确定义的类型,而不是在您的LINQ中执行select new,这将为您提供编码优势以及性能提升,因为不会涉及装箱/拆箱。

您的LINQ将是:

public List<Event> GetEventsForAdmin()
{
    using (var dbEntities = new CapeledEntities())
    {
        return (from e in dbEntities.Events
                join lnk in dbEntities.linkEventCategories on e.EventId equals lnk.EventId
                join cat in dbEntities.Categories on lnk.CategoryId equals cat.CategoryId
                orderby e.StartDateTime descending
                select new Event() { 
                                .EventId = e.EventId, 
                                .EventTitle = e.Title,
                                .StartDateTime = e.StartDateTime,
                                .Description = e.Description, 
                                .CatTitle = cat.Title 
               }
        ).ToList();
    }
}

答案 2 :(得分:1)

据我所知,似乎有三种可能的方式。

1)使用Dynamic(需要.Net 4.0或更高版本)

foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())

2)创建自己的类型(可能是一个类)而不是anonymous type

3)第三个是使用CastByExample的棘手问题here

object obj = eventHelper.GetEventsForAdmin();
var events = CastByExample(obj, new[] { 
                                    new { EventId = 0, 
                                          EventTitle = "",
                                          StartDateTime = DateTime.MinValue,
                                          Description = "", 
                                          CatTitle = ""
                                        }
                                      }.ToList());
foreach (var item in events)
{
    Console.WriteLine(item.EventId);
}

private static T CastByExample<T>(object obj, T example)
{
    return (T)obj;
}

4)正如@KingKing在评论中提到的,我错过了Reflection你也可以通过反思做到这一点,但这不是一个好主意。

据说尽可能多的方法,我会建议方法2,这是解决这个问题的理想方法。