Linq работает в одном утверждении, но не с выделением в свойстве - PullRequest
3 голосов
/ 02 марта 2010

У меня есть объект D, созданный из автоматического сопоставления таблицы D. Я добавил к нему следующее свойство в частичном классе.

public Address PhysicalAddress
{
   get { return this.Addresses.FirstOrDefault(a => a.AddrType == "PHY"); }
}

Это прекрасно работает само по себе.

Я хотел бы написать на нем следующий запрос linq:

var result = from d in _db.D
    where d.PhysicalAddress.State == addr.State
    select d;

Что не работает. Выдает NotSupportedException, когда я пытаюсь перебрать result.

Однако работает следующее:

var result = from d in _db.D
    where d.Addresses.Single(dAddr => dAddr.AddrType == "PHY").State == addr.State
    select d;

Почему Linq to Sql работает таким образом? Есть ли способ переписать мою собственность, чтобы она работала?

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Оператор LinQ для контекста данных пытается создать оператор SQL, который затем выполняется для базы данных. Поскольку PhysicalAddress - это логическое свойство, которое вы определяете с помощью частичного класса, хотя тип знает об этом, следовательно, он компилируется, Linq не может сопоставить это со столбцом БД, чтобы динамически создать запрос через поля. При использовании linq to sql строго придерживайтесь всех созданных сопоставленных столбцов.

Код в свойстве работает, потому что когда вы запрашиваете адреса, они внутренне сопоставляются с действительным столбцом или сгенерированным EntityRef.

2 голосов
/ 03 марта 2010

Вы также можете явно перечислить свою таблицу перед применением к ней предложения where, что предотвращает генерацию SQL, который не может быть отображен.

Имейте в виду, что производительность снижается! Вы извлекаете все, что не отфильтровали, прежде чем выполнять .ToList ()! Если вы сделаете это для большой таблицы, это может быть ужасно для вашей производительности запросов.

var result = _db.D.ToList().Where(d => d.PhysicalAddress.State == addr.State); 

или используя синтаксис запроса

var result = from d in _db.D.ToList()
    where d.PhysicalAddress.State == addr.State
    select d;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...