Перевод LINQ to SQL - PullRequest
       1

Перевод LINQ to SQL

1 голос
/ 16 марта 2010

В зависимости от того, как я сопоставляю свои запросы linq с объектами моего домена, я получаю следующую ошибку

У члена 'member' нет поддерживаемого перевода в SQL.

Этот код вызывает ошибку:

public IQueryable<ShippingMethod> ShippingMethods {
    get {
        return from sm in _db.ShippingMethods
               select new ShippingMethod(
                   sm.ShippingMethodID, 
                   sm.Carrier,
                   sm.ServiceName, 
                   sm.RatePerUnit, 
                   sm.EstimatedDelivery, 
                   sm.DaysToDeliver, 
                   sm.BaseRate, 
                   sm.Enabled
                );
    }
}

Этот код отлично работает:

public IQueryable<ShippingMethod> ShippingMethods
{
    get
    {
        return from sm in _db.ShippingMethods
               select new ShippingMethod
               {
                   Id = sm.ShippingMethodID,
                   Carrier = sm.Carrier,
                   ServiceName = sm.ServiceName,
                   EstimatedDelivery = sm.EstimatedDelivery,
                   DaysToDeliver = sm.DaysToDeliver,
                   RatePerUnit = sm.RatePerUnit,
                   IsEnabled = sm.Enabled,
                   BaseRate = sm.BaseRate
               };
    }
}

Это мой тестовый метод, с которым я тестирую:

[TestMethod]
public void Test_Shipping_Methods() {
    IOrderRepository orderRepo = new SqlOrderRepository();
    var items = orderRepo.ShippingMethods.Where(x => x.IsEnabled);
    Assert.IsTrue(items.Count() > 0);
}

Как способ, которым я создаю экземпляр моего объекта, влияет на перевод linq to sql?

Спасибо Бен

Ответы [ 2 ]

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

Он пытается отобразить весь запрос linq на SQL, включая все вызовы методов и свойств. Единственными исключениями являются синтаксис инициализатора объекта (как для анонимных именованных типов), так и методы расширения, которые сами сопоставляются с SQL (например, .Count()).

Короткая история: вы не можете использовать конструкторы не по умолчанию с Linq to SQL или Entity Framework.

1 голос
/ 16 марта 2010

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

После того, как вы проецируете (то есть с select), использование расширения Where больше не безопасно, пока вы не материализуете результаты с ToList(), ToArray() или подобным. Во втором случае просто случается, что работает, потому что проекция полностью прозрачна - все, что вы делаете, это присваивание свойств и тому же классу. Конструкторы не попадают в эту категорию; как говорится в сообщении об ошибке, в SQL Server нет эквивалентного представления вызова конструктора.

Зачем вам вообще нужно делать эту проекцию? Все свойство может быть заменено просто:

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