Linq to SQL,如何在不执行查询的情况下获取单个元素?

Linq to SQL, how to get single element without executing the query?

我偶然发现了一个优化问题,也许有解决办法。

假设我有以下实体:

public class EntityOne
{
  public int Id {get; set;}
  public virtual ICollection<Names> Names { get; } 
}

我想获取一个符合特定条件的名称。 假设我创建了给定的模型:

public class EntityView
{
  public int Id {get; set;}
  public string SingleName {get; set;}
}

现在我想在单个查询中获取 EntityView 模型的信息。 到目前为止,我是这样做的:

var result = db.EntityOnes
.Include(a => a.Names)
.Select(a => new EntityView 
{
  Id = a.Id,
  Name = a.Names.Where(b => b.Criteria == Criteria).Select(b => b.Name).FirstOrDefault()
}).ToList();

有没有什么方法可以让我不必在主查询中执行 FirstOrDefault,并且仍然只为我的 EntityView 模型获取一条记录?

谢谢大家!

您可以跳过查询中的 Where()Select()

var result = db.EntityOnes
    .Include(a => a.Names)
    .Select(a => new EntityView 
    {
        Id = a.Id,
        SingleName = a.Names.FirstOrDefault(b => b.Criteria == Criteria)?.Name
    }).ToList();

我觉得这比你的快:

var result = db.EntityOnes
.Include(a => a.Names)
.Select(a => new EntityView 
{
  Id = a.Id,
  SingleName = a.Names.FirstOrDefault(b => b.Criteria == Criteria)?.Name ?? ""
}).ToList();

知道我的名字只会有一个结果,我可以按如下方式加入 IEnumerable 结果:

var result = db.EntityOnes
.Include(a => a.Names)
.Select(a => new EntityView 
{
  Id = a.Id,
  Name = string.Join("", a.Names.Where(b => b.Criteria == Criteria).Select(b => b.Name))
}).ToList();

这样我就可以从查询中获取单个字符串并执行一次对数据库的调用