C# 如何使用实体框架在数据库中添加不同的值 IEnumerable data=GetWebPages(); foreach(数据中的var值) { if(value.WebPage.Contains(“.htm”)) { WebsiteWebPage pagesinfo=新网站网页(); pagesinfo.WebPage=value.WebPage; pagesinfo.WebsiteId=网站ID; 添加(pagesinfo); } } db.SaveChanges();
在上面的代码中,我只想向数据库添加不同的值。请帮助我如何做,因为我无法找到任何解决方案。假设您需要它们在网页和网站ID上是唯一的C# 如何使用实体框架在数据库中添加不同的值 IEnumerable data=GetWebPages(); foreach(数据中的var值) { if(value.WebPage.Contains(“.htm”)) { WebsiteWebPage pagesinfo=新网站网页(); pagesinfo.WebPage=value.WebPage; pagesinfo.WebsiteId=网站ID; 添加(pagesinfo); } } db.SaveChanges();,c#,entity-framework,C#,Entity Framework,在上面的代码中,我只想向数据库添加不同的值。请帮助我如何做,因为我无法找到任何解决方案。假设您需要它们在网页和网站ID上是唯一的 IEnumerable data=GetWebPages(); foreach(数据中的var值) { if(value.WebPage.Contains(“.htm”)) { WebsiteWebPage pagesinfo=新网站网页(); if(db.websitewebages.All(c=>c.WebPage!=value.WebPage | | c.Web
IEnumerable data=GetWebPages();
foreach(数据中的var值)
{
if(value.WebPage.Contains(“.htm”))
{
WebsiteWebPage pagesinfo=新网站网页();
if(db.websitewebages.All(c=>c.WebPage!=value.WebPage | | c.WebsiteId!=WebsiteId))
{
pagesinfo.WebPage=value.WebPage;
pagesinfo.WebsiteId=网站ID;
添加(pagesinfo);
}
}
}
db.SaveChanges();
更新
要对此进行优化(假设您的表包含的数据比当前列表多得多),请覆盖网站网页
中的equals
类以定义唯一性条件,然后:
var myWebsiteWebPages=data.select(x=>newWebsiteWebPages{WebPages=x.WebPages,WebsiteId=WebsiteId}).Distinct();
var duplicates=db.WebsiteWebPages.Where(x=>myWebsiteWebPages.Contains(x));
db.WebsiteWebPages.AddRange(myWebsiteWebPages.Where(x=>!duplicates.Contains(x));
这是一个单数据库查询,仅检索重复项,然后将其从列表中删除我假设“不同的值”是指“不同的value.WebPage
value”:
IEnumerable data=GetWebPages();
foreach(数据中的var值)
{
if(value.WebPage.Contains(“.htm”))
{
var a=db.WebsiteWebPages.Where(i=>i.webPages==value.webPages.ToString()).ToList();
如果(a.Count==0)
{
WebsiteWebPage pagesinfo=新网站网页();
pagesinfo.WebPage=value.WebPage;
pagesinfo.WebsiteId=网站ID;
添加(pagesinfo);
db.SaveChanges();
}
}
}
这是我用来添加不同数据的代码。我希望它对您有所帮助。您可以使用以下代码
IEnumerable<WebsiteWebPage> data = GetWebPages();
foreach (var value in data)
{
if (value.WebPage.Contains(".htm"))
{
var a = db.WebsiteWebPages.Where(i => i.WebPage == value.WebPage.ToString()).ToList();
if (a.Count == 0)
{
WebsiteWebPage pagesinfo = new WebsiteWebPage();
pagesinfo.WebPage = value.WebPage;
pagesinfo.WebsiteId = websiteid;
db.WebsiteWebPages.Add(pagesinfo);
db.SaveChanges();
}
}
}
除了提供的代码示例FurkanÖztürk外,请确保您的数据库具有约束,以便您不能在列中输入重复的值。皮带和支架的方法。什么是不同的值?这里的唯一值是什么?我猜
db.WebsiteWebPages.All(…)
将对数据中的每个值发出SELECT
请求?是的,它将发出请求。如果列表中有10000项-这将是10000个无用的SQL查询。@vasily.sib Agree。。。这不是我写这篇文章的方式,但这是我回答某人问我他的代码有什么问题的方式。。。您的解决方案可能比我的解决方案更糟糕,因为它有一个巨大的表,而实体无法处理。其中(x=>myWebsiteWebPage.Contains(x))
,此外,您不仅需要重写.Equals()
,还需要重写.GetHashCode()
,以使用.Distinct()的无参数版本
@vasily.sib EF 4+支持Contains()
查询,该查询保证插入不同的值,但不保证这些值在数据库中不存在,因此插入不同的值duplicate@jalsh,现在它保证这些值在dbSo中不存在,如果这是在一个10亿记录表中插入5个项目,那么您将在内存中加载几GB并对其进行迭代?那么,如果这是在一个5记录表中插入10亿项目,那么您将在内存中向数据库加载几GB并让它对其进行迭代?(你也会在你这边迭代它来序列化它以便发送)正是我的观点,你不能告诉他什么是他的问题的最佳解决方案,你只需要给他一个有效的解决方案,当他询问性能并给出信息时,你就会这样做网站网页是一个对象,所以templast.Distinct()
将通过引用而不是网页
值进行检查,因此模板列表中的所有项目都将保留
// get existing values (if you ever need this)
var existingWebPages = db.WebsiteWebPages.Select(v => v.WebPage);
// get your pages
var webPages = GetWebPages().Where(v => v.WebPage.Contains(".htm"));
// get distinct WebPage values except existing ones
var distinctWebPages = webPages.Select(v => v.WebPage).Distinct().Except(existingWebPages);
// create WebsiteWebPage objects
var websiteWebPages = distinctWebPages.Select(v =>
new WebsiteWebPage { WebPage = v, WebsiteId = websiteid});
// save all at once
db.WebsiteWebPages.AddRange(websiteWebPages);
db.SaveChanges();
IEnumerable<WebsiteWebPage> data = GetWebPages();
foreach (var value in data)
{
if (value.WebPage.Contains(".htm"))
{
var a = db.WebsiteWebPages.Where(i => i.WebPage == value.WebPage.ToString()).ToList();
if (a.Count == 0)
{
WebsiteWebPage pagesinfo = new WebsiteWebPage();
pagesinfo.WebPage = value.WebPage;
pagesinfo.WebsiteId = websiteid;
db.WebsiteWebPages.Add(pagesinfo);
db.SaveChanges();
}
}
}
IEnumerable<WebsiteWebPage> data = GetWebPages();
var templist = new List<WebsiteWebPage>();
foreach (var value in data)
{
if (value.WebPage.Contains(".htm"))
{
WebsiteWebPage pagesinfo = new WebsiteWebPage();
pagesinfo.WebPage = value.WebPage;
pagesinfo.WebsiteId = websiteid;
templist.Add(pagesinfo);
}
}
var distinctList = templist.GroupBy(x => x.WebsiteId).Select(group => group.First()).ToList();
db.WebsiteWebPages.AddRange(distinctList);
db.SaveChanges();
var res = tempList.Distinct(x=>x.WebsiteId).ToList();
db.WebsiteWebPages.AddRange(res);
db.SaveChanges();