Linq to SQL: .FirstOrDefault () не применяется для выбора нового {...} - PullRequest
4 голосов
/ 14 октября 2008

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

До этого момента я использовал следующую схему выбора вещи с 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.

Как проверить 0 «строк», возвращаемых запросом, используя второй шаблон?



UPDATE:

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

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

Ошибка компиляции: невозможно неявное преобразование типа "AnonymousType # 1" в "[DataContext] .User".

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

Ответы [ 5 ]

13 голосов
/ 14 октября 2008

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

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.
}

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

2 голосов
/ 16 января 2009

Обновление:

Теперь я вижу, о чем вы на самом деле спрашивали! Извините, мой ответ больше не применяется. Я думал, что вы не получаете нулевое значение, когда оно было пустым. Принятый ответ правильный, если вы хотите использовать объект вне области видимости, вам нужно создать новый тип и просто использовать New MyType (...). Я знаю, что в DevEx RefactorPro есть рефакторинг для этого, и я думаю, что 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);

Это помогает мне.

1 голос
/ 14 октября 2008

Что касается вашего ОБНОВЛЕНИЯ: вы должны либо создать свой собственный тип, изменить this._user на int , либо выбрать весь объект, а не только определенные столбцы.

1 голос
/ 14 октября 2008
if (person.Any()) /* ... */;

OR

if (person.Count() == 0) /* ... */;
0 голосов
/ 14 октября 2008

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

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

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

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