【问题标题】:C# LINQ select from listC# LINQ 从列表中选择
【发布时间】:2010-06-25 09:42:00
【问题描述】:

我有一个从 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 的事件。所以我会有类似的东西:

select * from eventsdb where eventId in GetEventIdsByEventDate()

我如何使用 LINQ 做到这一点


我似乎无法得到任何有效的答案。

这是从 XML 提要中查找 eventIds 的方法

public IList<EventsDetails> GetEventIds(DateTime eventDate)
    {

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

        return eventids;
    }

这是在我的数据库中查找事件的方法

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

这是在我的数据库中存在的 XML 中查找任何匹配 eventIds 的方法

public IEnumerable<EventFeed> FilteredEvents(DateTime eventDate)
    {

        return GetAllEventsFromDatabase().Where(p => GetEventIds(eventDate).Contains<EventsDetails>(p.EventShowCode)); 
    }

项目构建失败,出现以下错误:

错误 9 参数“2”:无法从“字符串”转换为“Events.EventsDetails”

【问题讨论】:

  • kb :您对此有明确的答案吗?能否请您标记一下,以便我们知道正确答案。

标签: c# linq


【解决方案1】:
        var eventids = GetEventIdsByEventDate(DateTime.Now);
        var result = eventsdb.Where(e => eventids.Contains(e));

如果您在方法内返回List&lt;EventFeed&gt;,则应将方法返回类型从IEnumerable&lt;EventFeed&gt; 更改为List&lt;EventFeed&gt;

【讨论】:

    【解决方案2】:

    类似于我如何使用 Google 找到这个问题,我想更进一步。 假设我有一个string[] states 和一个StateCounties 的数据库Entity,我只想返回列表中的状态,而不是所有StateCounties

    我会写:

    db.StateCounties.Where(x => states.Any(s => x.State.Equals(s))).ToList();
    

    我在CheckBoxList 的 nu-get 示例中找到了这个。

    【讨论】:

      【解决方案3】:

      与 SQL 查询相比,Linq-To-Sql 中的“in”使用反向逻辑。

      假设您有一个整数列表,并且想要找到与这些整数匹配的项目。

      int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
      
      var items = from p in context.Items
                       where numbers.Contains(p.ItemId)
                      select p;
      

      无论如何,上述方法在 linq-to-sql 中可以正常工作,但在 EF 1.0 中则不行。没有在 EF 4.0 中尝试过

      【讨论】:

        【解决方案4】:

        执行GetEventIdsByEventDate()方法并将结果保存在一个变量中,然后就可以使用.Contains()方法了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多