循环遍历具有联接的动态 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
。 }
更改
foreach (var myEvent in eventHelper.GetEventsForAdmin())
自
foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())
这应该允许您访问已强制转换为对象的匿名类型的成员。
与其使用 dynamic
,我建议您创建一个简单的struct
或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();
}
}
据我所知,似乎有三种可能的方法。
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,这是解决此问题的理想解决方案。