Вопрос

Кажется, Linq2sql не знает, как создать TSQL, пока вы преобразуете объект linq2sql в объект домена с помощью конструкторов.Такой как:

from c in db.Companies
select new Company (c.ID, c.Name, c.Location).Where(x => x.Name =="Roy");

Но при использовании настраиваемых атрибутов все будет в порядке.

from c in db.Companies
select new Company { ID = c.ID, Name = c.Name, Location = c.Location }.Where(x => x.Name =="Roy");

Я не хочу, чтобы эти атрибуты можно было устанавливать.Как я могу этого добиться?И может ли кто-нибудь дать пищу для размышлений о том, как linq 2 sql переводится в TSQL?Заранее спасибо!

Это было полезно?

Решение

Вероятно, это связано с тем, как L2S анализирует выражения — он может анализировать выражение инициализатора объекта, но не выражение конструктора.По сути, принцип работы L2S заключается в анализе выражений linq способом, любой провайдер LINQ делает а затем преобразовать результат в SQL.

Вы можете добиться того, чего хотите, сначала преобразовав его в IEnumerable, и тогда вы сможете свободно использовать LINQ для объектов.В приведенном вами примере это тривиально, но давайте обобщим случай с более сложным предложениемwhere:

var companyData =
    from c in db.Companies
    where c.Name.StartsWith("Roy")
    select new { c.ID, c.Name, c.Location };

var companies =
    from c in companyData.AsEnumerable()
    select new Company(c.ID, c.Name, c.Location);

Другие советы

Первый запрос неверен, поскольку оператор from вернет коллекцию сущностей компании.Чтобы получить только 1 компанию, вам нужно изменить первое утверждение на:

Company c = (from c in db.Companies where c.ID = someId select c).First();

Второй оператор неявно выполняет операторwhere.

Я предлагаю тебе бежать SQL-профилировщик при выполнении второго запроса, чтобы увидеть, что на самом деле используется в качестве оператора TSQL.

Он не может преобразовать запрос, включающий конструктор, поскольку не знает, что должен делать этот конструктор.У него есть сопоставления полей для свойств, но ваш конструктор может делать абсолютно все — зачем ему пытаться это угадать?

В любом случае неясно, какова будет цель сделать свойства доступными только для чтения для классов сущностей L2S — это тривиально можно обойти, удалив объект и воссоздав новый с тем же первичным ключом, но с новыми значениями свойств.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top