从SQL查询中的虚拟外键过滤数据

时间:2017-08-02 23:02:23

标签: c# linq lambda

我对Lambda / Linq比较陌生,但是我想从特定日历中检索所有事件,但事件仍在将来......

如果我使用:

EventCalendar eventCalendar;
eventCalendar = db.Events_Calendars.Find(id);

我可以通过视图中的当前日期获取所有事件并进行过滤,但我认为这不是最好的方法。

模型如下:

[Table("Events_Calendars")]
public class EventCalendar
{
    public int Id { get; set; }
    public string Calendar { get; set; }
    public virtual List<Event> Events { get; set; }
}

事件模型是:

public class Event
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public int? Capacity { get; set; }
    .
    .
    .
}

我在这个问题上失败的尝试之一是:

eventCalendar = db.Events_Calendars.Where(x => x.Events.Any(y => y.End >= DateTime.Today));

但它给了我“不能隐式转换类型'System.Linq.IQueryable&lt; ... Models.EventCalendar&gt;'到'... Models.EventCalendar'

编辑:添加了声明行... EventCalendar eventCalendar;

3 个答案:

答案 0 :(得分:1)

在where子句旁边使用.ToList()并声明var list =或list

答案 1 :(得分:1)

Linq Where方法返回匹配实体的列表。您试图将其返回到定义为单个实体的变量。如果您将eventCalendar定义为类型IQueryable<Models.EventCalendar>而不是Models.EventCalendar,则Linq语句将起作用。

或者,您也可以将eventCalendar定义为更健壮的List<Models.EventCalendar>,并在查询结束时使用Linq方法ToList()。即。 eventCalendar = db.Events_Calendars.Where(x => x.Events.Any(y => y.End >= DateTime.Today)).ToList();

答案 2 :(得分:1)

您的Events_Calendars.Where会返回IQueryable<Models.EventCalendar>,这意味着一些&#34;查询来源&#34; Models.EventCalendarEvents_Calendars.Find项,但Models.EventCalendar返回Models.EventCalendar项,因此您无法将某些Models.EventCalendar转换为eventCalendars。您可以声明新的变量var eventCalendars = db.Events_Calendars.Where(x => x.Events.Any(y => y.End >= DateTime.Today)).ToList(); 并将过滤项存储到它:

IQueryable

您也可以read了解IEnumerable$query = $db->query("select life_cycle, entered_into_service from assets, all_items where assets.type = all_items.type and assets.make = all_items.make and assets.model = all_items.model and all_items.item_num ='.$submittedValue'");

之间的区别