2011-06-17 104 views
2

我在LINQ to SQL中有以下查詢來從表中獲取所有不在聯接表中的記錄。爲什麼EF4中的匿名類型與LINQ to SQL不同?

// <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但匿名類型與組合ToList()的「CID」部分(ToList()引發的例外是沒有WHERE條件的簡化測試用例)失敗,出現異常:

無法創建類型'System.Object'的常量值 。在此上下文中僅支持原始 類型(如Int32,String和 Guid)。

爲什麼這樣或我在這裏錯過了什麼?

回答

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