请考虑以下代码:
// 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;
你的想法是什么?
关于第一个问题:
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.