我从另一个网站获取rss feed,如果该网站关闭,我不想收到错误。所以为了避免错误我试图将rss feed保存到数据库,如果rss服务器关闭,我将能够从我的数据库获取feed。
我还想在数据库中只保留6个Feed。如果有新的Feed,我想删除PublishDate
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 +新闻。只有原始类型或枚举 在这种情况下支持类型。
答案 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))