EF хранимая процедура - PullRequest
0 голосов
/ 13 июля 2011

Я работаю с EF 4.1, у меня есть хранимая процедура в моей базе данных, и я сопоставляю ее с моделью EF и добавляю функцию import

Мне нужно сделать что-то подобное:

        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 to Entities не распознает метод метода '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; }
    }

1 Ответ

0 голосов
/ 13 июля 2011

У меня была похожая проблема. Что происходит, когда EF создает Expression Tree на основе вашего выражения LINQ, и он не может перевести all.ChangeInfo.CreatedBy, и он передаст его как строку, поэтому вы получаете исключение для строки / длинного выражения.

Что я в итоге делаю, так это получаю значение all.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()});
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...