如何在LINQ中基于代码变量进行条件语句?

时间:2011-10-25 18:31:03

标签: c# linq

我意识到由于一些奇怪的原因你不能在.Select()之后链接.Where(),所以我想出了这个。

var eventCalendar = db.EventCalendars.Where(q => q.Date == e.Day.Date);

if (!isLogged)
{
    eventCalendar = eventCalendar.Where(q => q.ClientFlag == true);
}
eventCalendar = eventCalendar.Select(q => q.EnvironmentId).Distinct();

但是现在我得到了.Select

的错误
"Cannot implicitly convert type 'System.Linq.IQueryable<short>' to 'System.Linq.IQueryable<IT_Portal.EventCalendar>'. An explicit conversion exists (are you missing a cast?)"

我做错了什么?简单地说,我只想从Calendar事件表中获取Distinct Environment ID,这样我就可以在特定环境当天发生事件时通知用户。最后,如果用户未登录,则仅从标记为客户端显示的事件中获取环境ID(ClientFlag)。

4 个答案:

答案 0 :(得分:2)

你的最后一行是问题所在。您正在尝试重新使用与您分配的类型不同的局部变量。你只需稍微改变一下:

var eventCalendarEnvironmentIds = 
    eventCalendar.Select(q => q.EnvironmentId).Distinct();

答案 1 :(得分:1)

您需要一个新变量。

var environmentIDs = eventCalendar.Select(q => q.EnvironmentId).Distinct();

答案 2 :(得分:0)

通过选择Select(q =&gt; q.EnvironmentId),您实际上是在选择EnvironmentId而不是eventCalenderObject。

答案 3 :(得分:0)

尝试更改:

var eventCalendar = db.EventCalendars.Where(q => q.Date == e.Day.Date);

为:

 // I specify IQueryable, you can use 'var' - you simply need to change the variable name
IQueryable eventQuery = db.EventCalendars.Where(q => q.Date == e.Day.Date);

然后,选择:

var eventCalendar = eventQuery.Select(q => q.EnvironmentId).Distinct();

有时,当您继续使用var时,您可能会忽略数据类型。您应该尽可能多地使用实际数据类型。陷入使用var的陷阱并不是一个好习惯,IMO。