Запрос на существование объекта с LINQ (для сущностей) - PullRequest
3 голосов
/ 30 апреля 2010

(Я поставил «... для сущностей» в скобках, так как не знаю, имеет ли это вообще значение. Я думаю, это довольно общий вопрос, связанный с LINQ.)

Я хочу проверить с помощью LINQ (для сущностей), существует ли объект в базе данных. На данный момент я делаю следующее:

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
    var aQuery = from c
                 in aCtx.Client
                 where c.ClientID==1
                 select c;

    Client aClient = aQuery.FirstOrDefault();

    bool Exists = (aClient!=null);
    ...
}

Но (если я не ошибаюсь) это загружает полный объект клиента из базы данных (если клиент существует). На самом деле меня интересует, существует ли он или нет без загрузки объекта.

SQL имеет конструкцию SELECT COUNT(*).... Есть ли что-то подобное, что я могу сделать с LINQ?

Спасибо за совет!

Ответы [ 4 ]

7 голосов
/ 30 апреля 2010

Один из вариантов - использовать Любой метод IQueryable. Он вернет логическое значение, указывающее, был ли найден объект, соответствующий указанному условию.

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
    bool exists = (from c
                   in aCtx.Client
                   where c.ClientID==1
                   select c).Any();
}

Этот метод также перестанет работать, как только он оценивается как true.

2 голосов
/ 30 апреля 2010

Я бы тогда использовал Any() для определения существования. Независимо от того, создаете ли вы фиктивный экземпляр, подобный следующему, компилятор создаст инструкцию SQL с помощью функции Exists, и, следовательно, не будет иметь значения, что находится в операторе Select.

var query= from c
            in context.Client
            where c.ClientID == 1
            select new { Dummy = "foo" };

var exists = query.Any();
0 голосов
/ 30 апреля 2010

Вы можете использовать оператор Count () или любой оператор в вашем запросе, чтобы проверить, будет ли он возвращать результат:

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
    var aQuery = from c
                 in aCtx.Client
                 where c.ClientID==1
                 select c;

    int count = aQuery.Count();

    bool Exists = (count > 0);

    // or
    Exists = aQuery.Any();

    ...
}
0 голосов
/ 30 апреля 2010

Вы можете попробовать ...

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
     var aQuery = from c
         in aCtx.Client
         where c.ClientID==1
         select c;

     int total = aQuery.Count();

     bool Exists = (total > 0);
     ...
}

Не проверено ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...