我在LINQ to SQL中有以下查询来从Table中获取尚未存在于连接表中的所有记录。
// <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();
}
现在我已经开始迁移到EF4,但匿名类型的“Cid”部分与组合ToList()
(ToList()触发异常是一个没有WHERE条件的简化测试用例)失败,但异常:
无法创建常量值 输入'System.Object'。只有原始 类型('如Int32,String和 在此背景下支持Guid'。
为什么会这样或者我在这里遗漏了什么?
答案 0 :(得分:3)
EF不知道如何将表达式id + "." + i.Id
转换为有效的SQL,这就是失败的原因。您必须告诉EF它需要将id
从整数转换为字符串。您可以使用SqlFunctions
类以下列方式执行此操作:
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()
;