1

我有以下功能

 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 啊

  }
4

3 回答 3

2

而不是使用dynamic,我建议你创建一个简单的structclass这样的:

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

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

您的 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();
    }
}
于 2013-10-12T16:26:11.297 回答
2

改变

foreach (var myEvent in eventHelper.GetEventsForAdmin())

foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())

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

于 2013-10-12T16:20:47.953 回答
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,这是解决此问题的理想方法。

于 2013-10-12T16:53:16.397 回答