Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用linq和c的查询中创建包含另一种对象类型的列表的列表对象_C#_Linq_Linq To Sql - Fatal编程技术网

C# 如何在使用linq和c的查询中创建包含另一种对象类型的列表的列表对象

C# 如何在使用linq和c的查询中创建包含另一种对象类型的列表的列表对象,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我试图使用linq返回包含另一个对象列表作为DataMember的对象列表。我已经尝试了上面的例子,但每次尝试都会遇到不同的错误。其中之一如下:LINQ to Entities无法识别方法“System.Collections.Generic.List1[SunGard.Tools.Notifications.LinkVariable]ToList[LinkVariable]System.Collections.Generic.IEnumerable1[SunGard.Tools.Notific

我试图使用linq返回包含另一个对象列表作为DataMember的对象列表。我已经尝试了上面的例子,但每次尝试都会遇到不同的错误。其中之一如下:LINQ to Entities无法识别方法“System.Collections.Generic.List1[SunGard.Tools.Notifications.LinkVariable]ToList[LinkVariable]System.Collections.Generic.IEnumerable1[SunGard.Tools.Notifications.LinkVariable]”方法,并且无法将此方法转换为存储表达式

我有一个对象AlertMessageReturn,它包含一些字符串数据成员以及另一个对象列表的列表。我有一个定义LinkVariable的类和一个包含这些值的表。我的查询如下所示:

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”。

LINQ to SQL引擎无法将子查询转换为SQL来生成LinkVariables。更重要的是,SQL不能返回这样的嵌套数据集。

每当您收到“无法转换为存储表达式”类型的消息时,它指示您正在使用linq执行某些操作,而linq正试图转换为其他语句,通常是SQL。例如,如果你说

....select new MyObject
    {
         Id = Guid.Parse( passedIdentity ),
         ....
    }
虽然这是一个完全有效的C语句,但您将得到一个错误,即linq无法处理Guid.Parse。如果可以将变量移动到查询内部使用的外部变量中,那么就可以了。所以你会

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

还有。。。您不需要Select New语句上的结束参数。

虽然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();

我将查询分为2个部分,然后返回linkvariables列表,但是现在如何从查询中将其分配给AlertMessageQuery的linkvariables datamember?如果查询被发送到数据库,则不能从查询中进行分配。它必须完全在内存中工作。在linq查询中创建对象时,如何将linquery产生的linkData对象列表分配给AlertMessageReturn对象。有可能吗?虽然SQL Server不能返回对象图,但LINQ to SQL可以。它从SQL中提取平铺的行,并将它们翻转回封面下的对象图中。@JimWooley,只有在他将其连接起来的情况下。他似乎没有。我需要返回一个AlertMessageReturn类型列表,这将创建一个可枚举列表。我再次尝试分配一个收费表,但它不起作用。