Entity framework 为什么EF4中的匿名类型不同于LINQ和SQL?
我在LINQtoSQL中有以下查询,用于从一个表中获取尚未在jointable中的所有记录Entity framework 为什么EF4中的匿名类型不同于LINQ和SQL?,entity-framework,linq-to-sql,entity-framework-4,Entity Framework,Linq To Sql,Entity Framework 4,我在LINQtoSQL中有以下查询,用于从一个表中获取尚未在jointable中的所有记录 // <param name="id">The ID of the Person</param> IEnumberable<object> GetUnassignedClients(int id) { _db.Clients .Select(i => new { Client_id = i.Id, Perso
// <param name="id">The ID of the Person</param>
IEnumberable<object> GetUnassignedClients(int id)
{
_db.Clients
.Select(i => new
{
Client_id = i.Id,
Person_id = id,
Cid = id + "." + i.Id // Please don't ask why I do this. I just have to do it
// ... some more fields
})
.Where(o =>
!_db.Clients_Persons
.Where(t => t.Person_id == id)
.Select(t => t.Client_id)
.Contains(o.Client_id))
.Distinct().ToList();
}
//此人的ID
IEnumberable GetUnassignedClient(int id)
{
_db.客户
.选择(i=>new
{
客户识别号=i.id,
个人id=id,
Cid=id+“+i.id//请不要问我为什么要这样做。我只是必须这样做
//…更多的领域
})
。其中(o=>
!\u db.Clients\u Persons
.其中(t=>t.Person\u id==id)
.Select(t=>t.Client\u id)
.Contains(o.Client_id))
.Distinct().ToList();
}
现在我已经开始迁移到EF4,但是匿名类型的“Cid”部分与组合ToList()
(ToList()触发的异常是一个没有WHERE条件的简化测试用例)失败,出现异常:
无法创建的常量值
键入“System.Object”。只有原始的
类型('如Int32、String和
在此上下文中支持Guid')
为什么会这样,或者我在这里遗漏了什么?EF不知道如何将表达式
id+“+I.id
转换为有效的SQL,这就是它失败的原因。您必须告诉EF它需要将id
从整数转换为字符串。您可以通过以下方式使用类执行此操作:
var ret = _db.Clients
.Select(i => new
{
Client_id = i.Id,
Person_id = id,
Cid = SqlFunctions.StringConvert((double) id) + "." + SqlFunctions.StringConvert((double) i.Id) // Please don't ask why I do this. I just have to do it
// ... some more fields
})
.Where(o =>
!_db.Clients_Persons
.Where(t => t.Person_id == id)
.Select(t => t.Client_id)
.Contains(id)
)
.Distinct()
.ToList()
;