2012-06-13 1 views
0

Я пытаюсь вернуть список объектов, содержащий другой список объектов, в качестве databmember, используя linq. Я пробовал показанные примеры, но при каждой попытке я все время получаю различные ошибки. Один из них выглядит следующим образом: LINQ to Entities не распознает метод 'System.Collections.Generic.List 1[SunGard.Tools.Notifications.LinkVariable] ToList[LinkVariable](System.Collections.Generic.IEnumerable 1 [SunGard.Tools.Notifications.LinkVariable])', и этот метод не может быть переведен в выражение хранилища.Как создать объект списка, который содержит список другого типа объекта, используя из запроса с помощью linq и C#

У меня есть объект (AlertMessageReturn), который содержит некоторые строковые данные, а также список другого объекта (списка). У меня есть класс, который определяет LinkVarible и таблицу, содержащую значения. Мой запрос выглядит так:

AlertMessagesQuery = from alertMessage in this.context.AlertMessages 
where alertMessage.UserId=UserId            
select new AlertMessageReturn() 
{ PAM_ShortMessage = alertMessage.PAM_ShortMessage, 
PAM_LongMessage = alertMessage.PAM_LongMessage, 
PAM_LongMessageRemote = alertMessage.PAM_LongMessageRemote, 
LinkVariables = (from linkVariable in this.context.AlertMessageLinks 
from user in this.context.AlertMessageUsers 
where user.PAMU_PAM_ID == linkVariable.PAML_PAM_ID && user.PAMU_UserId == UserId 
select new LinkVariable() 
    { 
    Name = linkVariable.PAML_SessionVariableName, 
    Value = linkVariable.PAML_SessionVariableValue 
    }) 
}; 

Ошибка связана с типом, возвращаемым для linkvariables. Пожалуйста, помогите.

Я изменил код следующим образом:

LinkDataQuery = from linkData in this.context.AlertMessageLinks 
    from user1 in this.context.AlertMessageUsers 
    where user1.PAMU_PAM_ID == linkData.PAML_PAM_ID && user1.PAMU_UserId == UserId 
    select new LinkData 
     { 
     Name = linkData.PAML_SessionVariableName, 
      Value = linkData.PAML_SessionVariableValue 
     }; 
var links = LinkDataQuery.ToList(); 

    AlertMessagesQuery = from alertMessage in this.context.AlertMessages 
where alertMessage.UserId=UserId            
select new AlertMessageReturn() 
{ PAM_ShortMessage = alertMessage.PAM_ShortMessage, 
    PAM_LongMessage = alertMessage.PAM_LongMessage, 
    PAM_LongMessageRemote = alertMessage.PAM_LongMessageRemote, 
    LinkVariables = links 
}; 


var AlertMessages = AlertMessagesQuery.ToList(); // this is where the error point to 
         if (AlertMessages.Any()) 
         { 
          return AlertMessages; 
         } 

Ошибка теперь я получаю: System.NotSupportedException: Невозможно создать постоянное значение типа «SunGard.Tools.Notifications.LinkData». В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

ответ

0

Механизм LINQ to SQL не может преобразовать ваш подзапрос для генерации LinkVariables в SQL. Что еще более важно, SQL не может возвращать вложенные наборы данных, подобные этому.

+0

Я пробовал разделить запросы: – user1453999

+0

Могу ли я увидеть код в его нынешнем виде? – bluevector

+0

Я редактировал свой предыдущий код с тем, как он стоит сейчас. – user1453999

0

Каждый раз, когда вы получаете сообщение типа «не может быть переведено в выражение хранилища», это индикатор того, что вы что-то делаете с вашим linq, который пытается быть переведен в другие операторы (обычно SQL). Например, если вы говорите,

....select new MyObject 
    { 
     Id = Guid.Parse(passedIdentity), 
     .... 
    } 

в то время как это полностью действительный C# заявление вы получите сообщение об ошибке, что Guid.Parse не может быть обработан с помощью LINQ. Если можно переместить переменные во внешние переменные, которые используются внутри запроса, это сработает. Итак, вы бы сделали ...

string name = linkVariable.PAML_SessionVariableName; 
string nValue = .... 
.... 
select New LinkVariable 
{ 
    Name=name, 
    Value=nValue 
}; 

Также ... вам не нужны закрывающие parens в инструкции Select New.

+0

Я попробовал ваше предложение, но у меня все еще возникают ошибки. – user1453999

+0

Я разделил запросы на 2, и я вернул список linkvariables, но как мне теперь назначить его в datamember LinkVariables из AlertMessageQuery из запроса? – user1453999

+0

Вы не можете сделать это из запроса, если запрос отправляется в базу данных. Он должен работать исключительно в памяти. – bluevector

0

Хотя LINQ to SQL может возвращать иерархию объектов, он не может проектироваться в типы, которые не являются частью модели. Вместо проецирования в тип AlertMessageReturn попробуйте проецировать анонимный тип в часть кода IQueryable. После того, как вы закончите структурирование запроса к базе данных, заставьте результаты вернуться (используя AsEnumerable), а затем проецируйте их в свой тип AlertMessageReturn. Это больше накладных расходов, но работает. Кроме того, вы можете использовать что-то вроде AutoMapper для перевода вашего анонимного типа в типы результатов.

AlertMessagesQuery = 
     from alertMessage in this.context.AlertMessages 
     where alertMessage.UserId=UserId            
     select new 
     { 
     alertMessage.PAM_ShortMessage, 
     alertMessage.PAM_LongMessage, 
     alertMessage.PAM_LongMessageRemote, 
     LinkVariables = from linkVariable in this.context.AlertMessageLinks 
         from user in this.context.AlertMessageUsers 
         where user.PAMU_PAM_ID == linkVariable.PAML_PAM_ID && user.PAMU_UserId == UserId 
         select new 
         { 
          Name = linkVariable.PAML_SessionVariableName, 
          Value = linkVariable.PAML_SessionVariableValue 
         }) 
     }; 
    var alertMessageResults = 
     from message in AlertMessagesQuery.AsEnumerable() 
     select new AlertMessageResult 
     { 
     PAM_ShortMessage = mesage.PAM_ShortMessage, 
     PAM_LongMessage = message.PAM_LongMessage, 
     PAM_LongMessageRemote = message.PAM_LongMessageRemote, 
     LinkVariables = (from variable in message.LinkVariables 
         select new LinkVariable { Name=variable.Name, Value = variable.Value}) 
         .ToList() 
     }; 
    return alertMessageResults.ToList(); 
+0

Мне нужно вернуть список из списка AlertMessageReturn List Это создает Enumerable . Я попытался снова назначить ToList(), но он не работает. – user1453999

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