Linq to SQL: .FirstOrDefault () не применимо для выбора нового {...}

Я просто спросил этот вопрос . Что привело меня к новому вопросу :)

До этого момента я использовал следующий шаблон выбора материала с Linq to SQL, с тем чтобы иметь возможность обрабатывать 0 «строк», возвращаемых запросом:

var person = (from p in [DataContextObject].Persons
              where p.PersonsID == 1
              select new p).FirstOrDefault();

if (person == null)
{
   //handle 0 "rows" returned.
}

Но я не могу использовать FirstOrDefault() , когда я это делаю:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

// Under the hood, this pattern generates a query which selects specific
// columns which will be faster than selecting all columns as the above
// snippet of code does. This results in a performance-boost on large tables.

How do I check for 0 "rows" returned by the query, using the second pattern?



UPDATE:

Я думаю, что моя сборка завершилась неудачно, потому что я пытаюсь присвоить результат запроса переменной ( this._user ), объявленной с типом [DataContext] .User .

this._user = (from u in [DataContextObject].Users
              where u.UsersID == [Int32]
              select new { u.UsersID }).FirstOrDefault();

Ошибка компиляции: Невозможно неявно преобразовать тип «Анонимный тип №1» в «[DataContext] .User».

Любые мысли о том, как я могу обойти это? Должен ли я сделать свой собственный объект?

4

5 ответы

Почему вы можете продолжать делать что-то? Это дает вам ошибку?

var person = (from p in [DataContextObject].Persons
              where p.PersonsID == 1
              select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode }).FirstOrDefault();

if (person == null) {    
   //handle 0 "rows" returned.
}

Он по-прежнему является ссылочным объектом, как и ваш фактический объект, он просто анонимный, поэтому вы не знаете фактического типа перед компиляцией кода.

13
добавлено
Обновлен мой вопрос.
добавлено автор roosteronacid, источник
Согласовано, вышеприведенное должно работать, если нет несвязанной ошибки времени выполнения.
добавлено автор Codewerks, источник

<�Сильный> Update:

Теперь я вижу, что вы на самом деле спрашивали! Извините, мой ответ больше не применяется. Я думал, что вы не получите нулевое значение, когда оно пустое. Принятый ответ правильный, если вы хотите использовать объект вне области видимости, вам нужно создать новый тип и просто использовать New MyType (...). Я знаю, что у RefExorPro DevEx есть рефакторинг для этого, и я думаю, что resharper также делает.

Вызовите .FirstOrDefault (null) следующим образом:

string[] names = { "jim", "jane", "joe", "john", "jeremy", "jebus" };
var person = (
    from p in names where p.StartsWith("notpresent") select 
        new { Name=p, FirstLetter=p.Substring(0,1) } 
    )
    .DefaultIfEmpty(null)
    .FirstOrDefault();

MessageBox.Show(person==null?"person was null":person.Name + "/" + person.FirstLetter);

Это делает трюк для меня.

2
добавлено
if (person.Any()) /* ... */;

ИЛИ

if (person.Count() == 0) /* ... */;
1
добавлено

Что касается вашего UPDATE: вам нужно либо создать свой собственный тип, измените this._user на int , либо выберите весь объект, а не только определенные столбцы.

1
добавлено

Вы все еще можете использовать FirstOrDefault . Просто иметь

var PersonFields = (...).FirstOrDefault()  

PersonFields будет null или объект с теми свойствами, которые вы создали.

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)