当前位置:  开发笔记 > 编程语言 > 正文

使用EF和LINQ减少到数据库的次数

如何解决《使用EF和LINQ减少到数据库的次数》经验,为你挑选了1个好方法。

请考虑以下代码:

// check record exists

Adjuster adj = new Adjuster();

if (db.Adjusters.Where(x => x.userID == user.id).Any())
{
    adj = db.Adjusters.Where(x => x.userID == user.id).FirstOrDefault();
}
else
{
    // create adjuster record
    adj.id = Guid.NewGuid();
    adj.userID = user.id;

    db.Adjusters.InsertOnSubmit(adj);
}

注意我先打电话.Any()然后打电话.FirstOrDefault().这将是对数据库的两个单独查询,对吧?我怎样才能将其限制为一个?

现在,请考虑以下代码:

adj.isPropertyAdjuster = user.SomeEntity.someProperty;
adj.isCasualityLiabilityAdjuster = user.SomeEntity.someProperty;
adj.isLargeLossAdjuster = user.SomeEntity.someProperty;

db.SubmitChanges();

使用LINQ/EF,我可以访问与彼此有关系的不同实体.但是,每次我这样做时,这不会引起对数据库的多次调用吗? 例如,这三个单独的数据库调用是什么?

adj.isPropertyAdjuster = user.SomeEntity.someProperty;
adj.isCasualityLiabilityAdjuster = user.SomeEntity.someProperty;
adj.isLargeLossAdjuster = user.SomeEntity.someProperty;

如何将此限制为对数据库的单一调用?我假设唯一的方法是实例化一个这样的对象:

SomeEntity obj = user.SomeEntity;

然后,像这样调用属性:

adj.isPropertyAdjuster = obj.someProperty;

你的想法是什么?



1> Bobson..:

关于第一个问题:

var adjuster = db.Adjusters.FirstOrDefault(x => x.userID == user.id);
if (adjuster == null)
{
  // create adjuster record
    adjuster.id = Guid.NewGuid();
    adjuster.userID = user.id;

    db.Adjusters.InsertOnSubmit(adjuster);
}

关于第二个,我相信EF在加载数据时会缓存数据,因此您的第一次访问user.SomeEntity.someProperty将会访问数据库,但所有后续访问都不会.不过,您可能希望查看Eager Loading.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有