Будет ли работать ручное сопоставление Linq-To-Sql с выражениями? - PullRequest
0 голосов
/ 23 марта 2011

У меня есть эта проблема: enter image description here

Тип Vehicle происходит от типа EntityObject, который имеет свойство "ID".

Я думаю, я понимаю, почему L2S можетне переводить это на SQL - он не знает, что предложение WHERE должно включать WHERE VehicleId == value.VehicleId Кстати, это PK на столе, тогда как свойство в объектной модели, как указано выше, это "ID".

Могу ли я даже выиграть это с деревом выражений?Потому что, кажется, достаточно просто создать Expression для перехода к методу SingleOrDefault, но L2S все равно не сможет его перевести?

Я пытаюсь использовать DDD, поэтому я не хочу украшатьобъекты моей доменной модели с ColumnAttributes и т. д. Однако я рад настроить свой файл L2S dbml и добавить помощников Expression / что угодно в моем «слое данных» в надежде сохранить этот ORM-бизнес вдали от моей доменной модели.

Обновление:

Я не использую синтаксис инициализации объекта в своем операторе select.Вот так:

private IQueryable<Vehicle> Vehicles() 
{
    return from vehicle in _dc
        select new Vehicle() { ID = vehicle.VehicleId };
}

Я на самом деле использую конструктор и из того, что я прочитал , это вызовет вышеуказанную проблему.Вот что я делаю:

private IQueryable<Vehicle> Vehicles() 
{
    return from vehicle in _dc
        select new Vehicle(vehicle.VehicleId);
}

Я понимаю, что L2S не может преобразовать дерево выражений из скриншота выше, потому что он не знает отображений, которые он обычно выводит из синтаксиса инициализации объекта,Как я могу обойти это?Нужно ли создавать Expression с привязками атрибутов?

Ответы [ 2 ]

0 голосов
/ 11 июня 2012

Я решил, что это невозможно из дальнейшего опыта.

L2S просто не может создать правильное предложение WHERE, когда параметризованный ctor используется в проекции отображения. Это синтаксис инициализатора в традиционных проекциях отображения L2S, который дает L2S необходимый контекст.

Краткий ответ - используйте NHibernate.

0 голосов
/ 20 мая 2011

Краткий ответ: Не надо.

Однажды я пытался применить IQueryable <.IEntity> к Linq2Sql.Я сильно обгорел.

Как вы сказали.L2S (и EF тоже в этом отношении) не знает, что ID сопоставлен со столбцом VehicleId.Вы можете обойти это путем рефакторинга вашего Vehicle.ID в Vehicle.VehicleID.(Да, они работают, если они имеют одинаковое имя).Однако я все еще не рекомендую это.

Используйте L2S с предоставленным им объектом.Маскирование над ним дополнительного слоя при работе с IQueryable ... это плохо для IMO (по моему опыту).

В противном случае стоит делать .ToList () после выполнения оператора select.Это загружает все транспортные средства в вашу память.Затем вы выполняете проверку .Where для коллекции объектов Linq 2.Конечно, это будет не так эффективно, как L2S обрабатывает все запросы и приводит к большему использованию памяти.

Короче говоря.Не используйте Sql IQueryable с какими-либо объектами, кроме тех, для которых он был изначально разработан.Это просто не работает (хорошо).

...