Asp.Net MVC 5将rss保存到数据库

时间:2014-08-05 17:42:31

标签: asp.net-mvc rss asp.net-mvc-5

我从另一个网站获取rss feed,如果该网站关闭,我不想收到错误。所以为了避免错误我试图将rss feed保存到数据库,如果rss服务器关闭,我将能够从我的数据库获取feed。 我还想在数据库中只保留6个Feed。如果有新的Feed,我想删除PublishDate

的最后一个Feed
 public static List<Rss.News> GetRssFeed(ApplicationDbContext db)
      {
         try
         {
           XDocument feedXml = XDocument.Load("http://www.gib.gov.tr/
           rss/haberguncel.php");
           var feeds = from feed in feedXml.Descendants("item")
           select new Rss.News
           {
             Title = feed.Element("title").Value,
             Link = feed.Element("link").Value,
             Description = feed.Element("description").Value,
             PublishDate=feed.Element("pubdate").Value
           };

           int counter = 0;
           var itemE = db.News.FirstOrDefault();
           if (itemE != feeds.First())
           {
             foreach (var itemC in feeds)
           {
             if (!db.News.Contains(itemC))
             {
               db.News.Add(itemC);
               db.SaveChanges();
               counter += 1;
             }
             else
             {
               break;
             }
             if (counter == 6) { break; }
             }
             }
             return feeds.ToList();
             }
             catch (Exception)
             {
                // i will get data from database here.
             }
  }

运行此代码时出现此错误:

  

无法创建类型的常量值   ” ...... Models.Rss +新闻。只有原始类型或枚举   在这种情况下支持类型。

1 个答案:

答案 0 :(得分:1)

错误源于此行:

if (!db.News.Contains(itemC))

为了在数据库级别执行此类评估,实体框架必须能够将要比较的项目(itemC)转换为常量值,这对于此类型无法做到,因此您的错误。您可以尝试首先将db.News转换为列表,这会将评估切换到内存而不是数据库,即:

var news = db.News.ToList();
if (news.Contains(itemC))

但是,您必须评估这可能会如何影响应用程序的性能。或者,您只需查询您确定为查找“关键字”的特定值。例如,您可能会说Link只会匹配相同的项目,因此基于此:

if (!db.News.Any(m => m.Link == itemC.Link))