C#LINQ从列表中选择

时间:2010-07-30 10:19:14

标签: c# linq

几个星期前我问过这个问题,但无法得到任何建议的答案,所以我将不胜感激任何帮助:

我有一个从xml文档返回的事件ID列表,如下所示

public IEnumerable<EventFeed> GetEventIdsByEventDate(DateTime eventDate) 
{ 

    return (from feed in xmlDoc.Descendants("Show") 
            from ev in feed.Elements("Event") 
            where Convert.ToDateTime(ev.Attribute("Date").Value).ToShortDateString() == eventDate.ToShortDateString() 
            select new EventFeed() 
            { 
                EventShowCode = feed.Attribute("Code").Value 
            }).ToList();   
} 

我现在需要查询我的数据库以匹配与上述方法返回的eventIds相等的事件。所以我会有类似的东西:

从eventsdb中选择*,其中getEventIdsByEventDate()中的eventId

如何使用LINQ

执行此操作

感谢 KB

您好Prutswonder,我根据您的建议创建了以下方法

public IEnumerable<EventFeed> foo(DateTime str)
    {
        var foo = from f in GetAllEventsFromDatabase().ToList()
                  where GetAllEventsByDate(str).Contains(f.EventShowCode)
                  select e;

        return (IEnumerable<EventFeed>) foo;
    }

但是在编译时我得到以下错误

Error   7   The type arguments for method 'System.Linq.Enumerable.Contains<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

GetAllEventsFromDatabase:

public IEnumerable<EventFeed> GetAllEventsFromDatabase()
    {
        var allEvents = from eventsList in GetEventsList()
                        select new EventFeed()
                        {
                            EventName = eventsList.Title,
                            EventSummary = eventsList.Introduction,
                            EventShowCode = eventsList.EventId,
                            EventImageSmall = eventsList.EventImageThumbUrl,
                            EventUrl = eventsList.Url,
                            EventSortBy = eventsList.SortOrder
                        };

        return allEvents.OrderBy(x => x.EventSortBy);
    }

3 个答案:

答案 0 :(得分:2)

GetEventIdsByEventDate()方法应返回IEnumerable个字符串,包含事件ID(如方法名称所示):

public IEnumerable<string> GetEventIdsByEventDate(DateTime eventDate) 
{ 

    return (from feed in xmlDoc.Descendants("Show") 
            from ev in feed.Elements("Event") 
            where Convert.ToDateTime(ev.Attribute("Date").Value).ToShortDateString() == eventDate.ToShortDateString() 
            select feed.Attribute("Code").Value 
            ).ToList();   
} 

另外,不要忘记将foo()方法重命名为更合适的名称(例如GetEventsByEventDate()

答案 1 :(得分:1)

关于您的错误:

GetAllEventsByDate返回包含EventFeed对象的IEnumerable,因此当您使用“Contains”方法时,它期望“EventFeed”对象与列表中的对象进行比较。相反,你传递的是一个f.EventShowCode,我假设它是一个整数或其他东西:

EventShowCode = eventsList.EventId

我相信你所寻找的是:

public IEnumerable<EventFeed> foo(DateTime str)    
{    
    var foo = from f in GetAllEventsFromDatabase()
              where GetAllEventsByDate(str).Contains(f)    
              select f;

    return foo;
}    

答案 2 :(得分:-1)

下载LINQPad。它是免费的,但升级版本提供了Intellisense支持。这个应用程序帮我找出了一些非常复杂的LINQ查询。