循环遍历具有联接的动态 linq 对象

本文关键字:动态 linq 对象 遍历 循环 | 更新日期: 2023-09-27 18:35:09

>我有以下函数

 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

  }

循环遍历具有联接的动态 linq 对象

更改

foreach (var myEvent in eventHelper.GetEventsForAdmin())

foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())

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

与其使用 dynamic ,我建议您创建一个简单的structclass,如下所示:

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();
    }
}

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

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

foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())

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

3)第三个是一个棘手的,它使用CastByExample你可以在这里找到

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,这是解决此问题的理想解决方案。