Linq查询数据服务中使用的.NET匿名类型在选择时出错
当我编写一个相当简单的Linq查询客户端时,我看到了一个错误,该客户端应该根据我在这里读到的关于类似问题的其他问题来工作 我有以下测试代码:Linq查询数据服务中使用的.NET匿名类型在选择时出错,.net,entity-framework,linq,wcf,npgsql,.net,Entity Framework,Linq,Wcf,Npgsql,当我编写一个相当简单的Linq查询客户端时,我看到了一个错误,该客户端应该根据我在这里读到的关于类似问题的其他问题来工作 我有以下测试代码: var result = publicCtx.Participants.Where(x => x.CompanyID == 1008) .Select(x => new { ID = x.ID, Sequence = x.Sequence } ).ToList(); 执行此代码时,会出现以下错误: Construction of enti
var result = publicCtx.Participants.Where(x => x.CompanyID == 1008)
.Select(x => new { ID = x.ID, Sequence = x.Sequence } ).ToList();
执行此代码时,会出现以下错误:
Construction of entity type instances must use object initializer with default constructor.
从我所读到的内容来看,需要无参数构造函数的标准解决方案是使用匿名类型,我在这里使用匿名类型。数据类型是int?用于CompanyID和Sequence,字符串用于ID。所有这些都是实体模型中可为空的字段(旧数据库仍在转换中)。我正在使用一个WCF数据服务,该服务使用npgsql数据提供程序来提供服务端的实体模型
当我创建一个基本类来返回结果时,一切都会成功:
public class ParticipantResult
{
public string ID;
public int? Sequence;
}
与
编辑:我添加了周围的代码以供参考:
public MainWindow()
{
InitializeComponent();
try
{
publicCtx = ContextProvider.Public();
// This first Linq call DOES work with its anonymous type
var plan = publicCtx.Companies.Where(x => x.ID == 1008).Select(x => new { x.ID, x.PlanID }).FirstOrDefault().PlanID;
// This throws the error
var participants = publicCtx.Participants.Where(x => x.PlanID == plan).Select(x => new { ID = x.ID, Sequence = x.Sequence } ).ToList();
...
}
catch(Exception e)
{
Console.Write(e.Message);
}
DataContext = this;
NotifyAll(); // just a quick and dirty PropertyChanged call
}
public static class ContextProvider
{
public static PublicContext Public()
{
var pub = new Public.PublicContext(new Uri(ConfigurationManager.ConnectionStrings["PublicConnection"].ConnectionString));
pub.SendingRequest2 += AuthenticateContext;
return pub;
}
private static void AuthenticateContext(object sender, System.Data.Services.Client.SendingRequest2EventArgs e)
{
var user = ConfigurationManager.AppSettings["Username"];
var pw = ConfigurationManager.AppSettings["Password"];
var encodeStr = user + ":" + pw;
var encoded = Convert.ToBase64String(Encoding.ASCII.GetBytes(encodeStr));
e.RequestMessage.SetHeader("Authorization", "Basic " + encoded);
}
}
我还需要做些什么才能使匿名类型正常工作,这样我就不需要创建类来只为查询结果选择几列?我不知道第一个代码段如何抛出报告的错误。你能展示完整的方法吗?在我看来,在这段代码之前或之后发生了更多的事情。我已经添加了周围的代码以进行澄清。谢谢
public MainWindow()
{
InitializeComponent();
try
{
publicCtx = ContextProvider.Public();
// This first Linq call DOES work with its anonymous type
var plan = publicCtx.Companies.Where(x => x.ID == 1008).Select(x => new { x.ID, x.PlanID }).FirstOrDefault().PlanID;
// This throws the error
var participants = publicCtx.Participants.Where(x => x.PlanID == plan).Select(x => new { ID = x.ID, Sequence = x.Sequence } ).ToList();
...
}
catch(Exception e)
{
Console.Write(e.Message);
}
DataContext = this;
NotifyAll(); // just a quick and dirty PropertyChanged call
}
public static class ContextProvider
{
public static PublicContext Public()
{
var pub = new Public.PublicContext(new Uri(ConfigurationManager.ConnectionStrings["PublicConnection"].ConnectionString));
pub.SendingRequest2 += AuthenticateContext;
return pub;
}
private static void AuthenticateContext(object sender, System.Data.Services.Client.SendingRequest2EventArgs e)
{
var user = ConfigurationManager.AppSettings["Username"];
var pw = ConfigurationManager.AppSettings["Password"];
var encodeStr = user + ":" + pw;
var encoded = Convert.ToBase64String(Encoding.ASCII.GetBytes(encodeStr));
e.RequestMessage.SetHeader("Authorization", "Basic " + encoded);
}
}