2011-07-13 95 views
0

我与EF 4.1的工作,我有我的数据库中的存储过程,我把它映射到EF模型和我添加函数导入EF存储过程

我需要做这样的事情:

 MyDataContext db= new MyDataContext(); 
     var x = from all in db.Allergies 
       select new MyAllergy 
       { 
        Name = all.Name, 
        Id = all.Id, 
        user = db.GetUser(all.ChangeInfo.CreatedBy).FirstOrDefault() 
       }; 

但此异常抛出:

LINQ实体无法识别方法 'System.Data.Objects.ObjectResult 1[System.String] GetUser(System.Nullable 1 [System.Int64])' 方法,和该方法 无法翻译成商店表达式。

虽然这工作得很好:var user = db.GetUser(1).FirstOrDefault()

编辑:

public class MyAllergy 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string User { get; set; } 
    } 
public class Allergy 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ChangeInfo ChangeInfo { get; set; } 
    } 
public class ChangeInfo 
    { 
     public long CreatedBy { get; set; } 
    } 

回答

0

我有类似的问题。 EF会根据您的LINQ表达式创建表达式树,并且它不能翻译所有.ChangeInfo.CreatedBy,并且会将其作为字符串传递,这就是为什么您会收到有关字符串/长表达式的异常。

我最终所做的就是先取得所有.ChangeInfo.CreatedBy值。在我的情况下,它更容易。在你的情况你可能会去定期foreach循环:(

是这样的:

var myItems = new List<MyAllergy>(); 

    foreach (var item in db.Allergies) 
    { 
     var createdBy = item.ChangeInfo.CreatedBy; 

     myItems.Add(new MyAlergy {Name = item.Name, Id = item.Id, user = db.GetUser(createdBy).FirstOrDefault()}); 
    } 
+0

,但我不想让所有的数据存储器 – Mandoleen