Linq to SQL, как получить один элемент без выполнения запроса? - PullRequest
0 голосов
/ 14 января 2020

Я столкнулся с проблемой оптимизации, и, возможно, есть способ ее обойти.

Считайте, что у меня есть следующая сущность:

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

И я хочу получить одно имя это соответствует определенным c критериям. Допустим, я создал данную модель:

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();

Могу ли я go об этом сказать так, чтобы мне не приходилось выполнять FirstOrDefault внутри основного запроса, и до сих пор только одна запись для моей модели EntityView?

Спасибо всем!

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Я думаю, что это быстрее, чем у вас:

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();
0 голосов
/ 17 января 2020

Зная, что у меня будет только один результат из моих имен, я могу просто присоединиться к результату 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();

Таким образом, я получу одну строку из моего запроса и выполню один вызов в базу данных

0 голосов
/ 14 января 2020

Вы можете пропустить 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();
...