2

考虑以下代码:

// 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;

你觉得呢?你有没有什么想法?

4

3 回答 3

5

关于第一个问题:

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

于 2013-05-06T19:57:41.613 回答
2

对于您的第一个示例,您可以只调用FirstOrDefault()Any()完全退出组合:

Adjuster adj = db.Adjusters.Where(x => x.userID == user.id).FirstOrDefault();

if (adj == null)
{
  // create adjuster record
  adj.id = Guid.NewGuid();
  adj.userID = user.id;

  db.Adjusters.InsertOnSubmit(adj);
}

至于访问实体的导航属性是否会导致重复往返数据库,答案是(谢天谢地!)不会。根据您是否启用了延迟加载,该属性的值要么在第一次创建时与实体的其余部分一起加载,要么在第一次访问该属性时加载,然后缓存以供将来使用。

所以,你的例子...

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

...最多只需要一个额外的数据库查询,如果您在第一次加载时使用急切加载,甚至可能不需要user

于 2013-05-06T19:58:58.887 回答
2

您可以修复第一个代码

Adjuster adj = db.Adjusters.Where(x => x.userID == user.id).FirstOrDefault();

if (adj == null)
{
    // create adjuster record
    adj = new Adjuster();
    adj.id = Guid.NewGuid();
    adj.userID = user.id;

    db.Adjusters.InsertOnSubmit(adj);
}

第二部分很好。

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

db.SubmitChanges();

一旦加载一次,它不应该继续从数据库中提取 someEntity 。此外,在调用 submit 之前它不会保存任何内容。

于 2013-05-06T20:00:00.947 回答