Entity Framework - Выберите * из Entities, где Id = (выберите max (Id) из Entities) - PullRequest
4 голосов
/ 05 декабря 2011

У меня есть набор сущностей с именем Entities, который имеет поле Name и поле Version. Я хочу вернуть объект, имеющий наивысшую версию для выбранного Name.

Мудро я бы пошел

Select * 
from table 
where name = 'name' and version = (select max(version)  
                                   from table 
                                   where name = 'name')

Или что-то подобное. Не уверен, как добиться этого с EF. Я пытаюсь использовать CreateQuery<> с текстовым представлением запроса, если это поможет.

Спасибо

EDIT: Вот рабочая версия с использованием двух запросов. Не то, что я хочу, кажется очень неэффективным.

var container = new TheModelContainer();
var query = container.CreateQuery<SimpleEntity>(
    "SELECT VALUE i FROM SimpleEntities AS i WHERE i.Name = 'Test' ORDER BY i.Version desc");
var entity = query.Execute(MergeOption.OverwriteChanges).FirstOrDefault();
query =
    container.CreateQuery<SimpleEntity>(
        "SELECT VALUE i FROM SimpleEntities AS i WHERE i.Name = 'Test' AND i.Version =" + entity.Version);
var entity2 = query.Execute(MergeOption.OverwriteChanges);
Console.WriteLine(entity2.GetType().ToString());

Ответы [ 4 ]

7 голосов
/ 05 декабря 2011

Можете ли вы попробовать что-то подобное?

using(var container = new TheModelContainer())
{
    string maxEntityName = container.Entities.Max(e => e.Name);
    Entity maxEntity = container.Entities
                           .Where(e => e.Name == maxEntityName)
                           .FirstOrDefault();
}

Это выберет максимальное значение для Name из набора Entities, а затем выберет объект из набора объектов, который соответствует этому имени.

2 голосов
/ 17 мая 2014

Я думаю, с точки зрения простоты, это должен быть тот же результат, но быстрее, так как не требуется двухкратных поездок через EF на сервер sql, вы всегда хотите выполнить запрос как можно меньше раз для задержки, как поле Id является первичным ключом и проиндексирован, должен быть исполнителем

using(var db = new DataContext())
{
var maxEntity = db.Entities.OrderByDecending(x=>x.Id).FirstOrDefault()
}

Должен быть эквивалентным SQL-запросу

SELECT TOP 1 * FROM Entities Order By id desc

так включить поисковый запрос

string predicate = "name";

using(var db = new DataContext())
{
var maxEntity = db.Entities
.Where(x=>x.Name == predicate)
.OrderByDecending(x=>x.Id)
.FirstOrDefault()
}
2 голосов
/ 23 мая 2013

это самый простой способ получить максимум

using (MyDBEntities db = new MyDBEntities())
{
   var maxReservationID = _db .LD_Customer.Select(r => r.CustomerID).Max();
}
1 голос
/ 05 декабря 2011

Я думаю, что-то вроде этого ..?

        var maxVersion = (from t in table 
                         where t.name == "name"
                         orderby t.version descending
                         select t.version).FirstOrDefault();

        var star = from t in table
                   where t.name == "name" &&
                   t.version == maxVersion
                   select t;

Или как одно утверждение:

        var star = from t in table
                   let maxVersion = (
                     from v in table
                     where v.name == "name"
                     orderby v.version descending
                     select v.version).FirstOrDefault()
                   where t.name == "name" && t.version == maxVersion
                   select t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...