2012-12-21 2 views
6

Я работаю с EF и имею некоторые запросы. Вот мой кодСтатический метод Linq в инструкции SELECT

IEnumerable<Customer> customers = from c in context.Customers 
    select new Customer 
    { 
     ID = c.ID, 
     Name = c.Name, 
     LastName = c.LastName, 
     DepID = c.DepID, 
     Editable = SomeStruct.Check(c.DepID) 
    } 

public struct SomeStruct 
{ 
    public static bool Check(int depID) 
    { 
     //Here I have some logic 
    } 
} 

Он отлично работает. Однако, если я объявляю SomeStruct, как class, это не удастся.

Мои вопросы:

  1. Почему это происходит?
  2. Использует ли статическую функцию запрос для выполнения?
+9

Могу ли я подтвердить: если 'SomeStruct' является' class', но метод по-прежнему 'static', то он * не работает * Я правильно понимаю его? Если да: что происходит? Какое исключение? –

+0

Вы действительно уверены, что ваш код работает, когда SomeStruct является структурой? Можете ли вы добавить ToList() в свой оператор select и посмотреть, все ли работает? –

ответ

0

Предположим, что это проблема времени выполнения, во многих случаях, которую вы описываете, это справочная проблема. Поставщик linq EF поддерживает вызов статического метода, объявленного в классе (статический или нет).

  1. Я рекомендую вам изменить свою структуру на класс и сделать ее статической, чтобы помочь вам исследовать проблему.

  2. Нет, ничего не будет выполнено до вызова первой итерации или клиентов.

Надеется, что это помогает

6

В вашем методе кода SomeStruct.Check(c.DepID) должны быть преобразован в SQL запрос. Это описывает поведение с классом/structs и т. Д. Это связано с другой работой Entity Framework с такими методами в классе и структуре. Но вы можете сделать эту проверку на клиенте:

IEnumerable<Customer> customers = from c in context.Customers 
    select new 
    { 
     ID = c.ID, 
     Name = c.Name, 
     LastName = c.LastName, 
     DepID = c.DepID 
    } 
    .AsEnumerable() 
    .Select(d=>new Customer 
    { 
     ID = c.ID, 
     Name = c.Name, 
     LastName = c.LastName, 
     DepID = c.DepID, 
     Editable = SomeStruct.Check(c.DepID) 
    }); 

Или вы можете установить Editable свойство, как неизменяемые собственности:

public class Customer{ 
    public int ID{get;set;} 
    public string Name{get;set;} 
    public string LastName {get;set;} 
    public Guid DepID{get;set;} 
    public bool Editable{get{return SomeStruct.Check(DepID);}} 
} 
1

Это легко воспроизводимым, что ваш код не может работать с LINQ к объектам. Anything, который не может быть переведен в sql, выдает исключение во время выполнения. В случае вас:

NotSupportedException: LINQ к Entities не распознает метод метод «Логический Check (Int32)», и этот метод не может быть переведен в выражение магазина.

Если вы получили это работает в какой-то момент, что не может быть связано с struct или class различиях см What's the difference between a static struct method and a static class method?

Вы, наверное, изменилось что-то еще в то же время, как добавление ToList() перед select.

Смежные вопросы