我正在尝试使用linq将包含另一个对象列表的对象列表作为数据成员返回。我已经尝试过显示的示例,但每次尝试都会出现不同的错误。其中一个如下:LINQ to Entities无法识别方法'System.Collections.Generic.List 1[SunGard.Tools.Notifications.LinkVariable] ToList[LinkVariable](System.Collections.Generic.IEnumerable
1 [SunGard.Tools.Notifications.LinkVariable])'方法,并且此方法无法转换为商店表达。
我有一个对象(AlertMessageReturn),它包含一些字符串数据库以及另一个对象(List)的列表。我有一个定义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 :(得分:0)
LINQ to SQL引擎无法将您的子查询转换为SQL生成LinkVariables
。更重要的是,SQL不能返回那样的嵌套数据集。
答案 1 :(得分:0)
每当你收到类型'无法翻译成商店表达式'的消息时,它就表明你正在尝试将你的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语句中关闭parens。
答案 2 :(得分: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();