我知道这个问题已被多次询问,但我已经尝试了很多代码。
以下是我的代码:
public List<CollegeDetail> GetCollege()
{
using (CollegeDataEntities context = new CollegeDataEntities())
{
var result = (from cs in context.CollegeDetails
select new CollegeDetail
{
CollegeName = cs.CollegeName,
CollegeAddress = cs.CollegeAddress,
ContactPerson = cs.ContactPerson,
ContactPersonPhoneNo = cs.ContactPersonPhoneNo,
ContactPersonEmailID = cs.ContactPersonEmailID,
FirstVisitDate = cs.FirstVisitDate,
State = cs.State,
City = cs.City,
FDP = cs.FDP,
CreatedBy = cs.CreatedBy
}).AsEnumerable().Select(x => new CollegeDetail{
x.CollegeName,
x.CollegeAddress,
x.ContactPerson,
x.ContactPersonPhoneNo,
x.ContactPersonEmailID,
x.FirstVisitDate,
x.State,
x.City,
x.FDP,
x.CreatedBy
}).ToList();
return result.ToList();
}
}
现在更新代码后:
更新代码:
public List<CollegeDetail> GetCollege()
{
using (CollegeDataEntities context = new CollegeDataEntities())
{
var result = (from cs in context.CollegeDetails
select new CollegeDetail
{
CollegeName = cs.CollegeName,
CollegeAddress = cs.CollegeAddress,
ContactPerson = cs.ContactPerson,
ContactPersonPhoneNo = cs.ContactPersonPhoneNo,
ContactPersonEmailID = cs.ContactPersonEmailID,
FirstVisitDate = cs.FirstVisitDate,
State = cs.State,
City = cs.City,
FDP = cs.FDP,
CreatedBy = cs.CreatedBy
}).ToList();
return result;
}
}
以下错误即将发生:
错误来自上下文。
答案 0 :(得分:3)
这基本上是一团糟。你已经从另一个问题中复制了一个答案,却没有理解它的作用,以一种打破了代码应该修复的东西的方式改变了它,并留下了已经破坏的代码部分(其他的OP)问题评论)。
你认为你想做的最初的事情就是:
var result = (from cs in context.CollegeDetails
select new CollegeDetail
{
CollegeName = cs.CollegeName,
// ...
CreatedBy = cs.CreatedBy
});
正如您所发现的那样,The entity cannot be constructed in a LINQ to Entities query的OP也是如此,您无法做到这一点。你不能创建像这样的实体,原因是在那个问题上解释的 - 基本上如果你创建这样的实体,那就不清楚数据库中的表示是什么了。
不幸的是,你发现The entity or complex type ' ' cannot be constructed in a LINQ to Entities query你从那个问题中复制的答案中的(原始)建议是3}}而不是找到那个问题,而这个问题有一个相当不错的答案。 p>
var result = (from cs in context.CollegeDetails
select new
{
CollegeName = cs.CollegeName,
// ...
CreatedBy = cs.CreatedBy
}
)
.Select(c => new CollegeDetail
{
c.CollegeName,
// ...
c.CreatedBy
}
);
这个问题是他们没有在第二个构造函数中使用这些名称。他们可能在第一个构造函数中省略了名称,因为它是一个匿名类型,但没有。当他们在第二种类型中将它们遗漏时,它被解释为构造函数(集合初始值函数)之后的大括号的另一种用法。由于CollegeDetail
不是集合,因此会生成您看到的错误消息。
现在,该问题的OP指出答案不起作用(虽然有11人投了票)。回答者误解了错误消息,并在代码末尾添加了一个完全不必要的ToList()
。这不会有任何修复。他们的最终建议是:
var result = (from cs in context.CollegeDetails
select new
{
CollegeName = cs.CollegeName,
// ...
CreatedBy = cs.CreatedBy
}
)
.Select(c => new CollegeDetail
{
c.CollegeName,
// ...
c.CreatedBy
}
).ToList();
您使用了这个损坏的代码,并且由于只有您自己知道的原因,将第一个select
的匿名类型更改为更改为CollegeDetail
。 (也许你不熟悉匿名类型,并认为这是一个错字,或者也许是你的错字。)这重新引入了原始问题,使第二个select
多余,并没有修复破坏初始化程序。
var result = (from cs in context.CollegeDetails
select new CollegeDetail
{
CollegeName = cs.CollegeName,
// ...
CreatedBy = cs.CreatedBy
}
)
.Select(c => new CollegeDetail
{
c.CollegeName,
// ...
c.CreatedBy
}
).ToList();
您还有不必要的ToList
- 请注意,在您的情况下,您会在结果后立即再次致电ToList
。 (所以你有一个冗余的选择和一个冗余的ToList()
。这在货物编码中发生了很多。)
现在,这个问题的另外两个回答者看到你的第二个选择是无意义的和导致错误,因为初始化程序已经破坏,并将其删除。他们不知道你使用双select
试图解决什么问题,所以他们只是删除它,而不是帮助你解决这个问题。所有这些都让你回到原来的问题,这个代码不起作用,因为它将实体映射到另一个实体。换句话说,他们修复了从您复制的代码中引入的完全虚假错误。
var result = (from cs in context.CollegeDetails
select new CollegeDetail
{
CollegeName = cs.CollegeName,
// ...
CreatedBy = cs.CreatedBy
});
现在这是一次往返 - 到目前为止,这个问题的所有答案都是为了让你回到原来的问题。
解决方案的目的不是盲目地复制代码而不理解它如何解决问题。不要相信发布任何代码的任何回答者,而不解释它如何解决问题。
将字段名称放回第二个select
:
var result = (from cs in context.CollegeDetails
select new
{
CollegeName = cs.CollegeName,
// ...
CreatedBy = cs.CreatedBy
}
)
.Select(c => new CollegeDetail
{
CollegeName = c.CollegeName,
// ...
CreatedBy = c.CreatedBy
}
);
你可以自由地将它们从第一个中取出来:
var result = (from cs in context.CollegeDetails
select new
{
cs.CollegeName,
// ...
cs.CreatedBy
}
)
.Select(c => new CollegeDetail
{
CollegeName = c.CollegeName,
// ...
CreatedBy = c.CreatedBy
}
);
除非你真的想要,否则不要重复ToList()
两次。并考虑做@Rawling建议的事情:
return context.CollegeDetails.ToList()
您似乎没有转换数据,并且您不希望将任何内容写回数据库。除非你知道这不是你想要的,否则它可能是。
确保您知道匿名类型是什么以及如何使用匿名类型。确保你确切知道lambda的含义。找出IEnumerable
和List
之间的区别,以及ToList
的作用。了解实体框架,实体与对象不同的原因,以及Linq to Entities(和Linq to SQL)如何以不同的方式工作,从Linq到Objects。 (Jon Skeet的博客是了解Linq的首选:http://msmvps.com/blogs/jon_skeet/Default.aspx)阅读此答案和评论中的讨论:https://stackoverflow.com/a/5325861/1737957再次阅读我的答案,您将只能在修改自己的代码时你明白你是怎么来到这里的。祝你好运!