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();
这样我就可以从查询中获取单个字符串并执行一次对数据库的调用
我偶然发现了一个优化问题,也许有解决办法。
假设我有以下实体:
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();
这样我就可以从查询中获取单个字符串并执行一次对数据库的调用