为什么EF4中的匿名类型与LINQ不同?

时间:2011-06-17 06:01:41

标签: entity-framework linq-to-sql entity-framework-4

我在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'。

为什么会这样或者我在这里遗漏了什么?

1 个答案:

答案 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()
;