Почему анонимные типы в EF4 отличаются от LINQ для SQL? - PullRequest
2 голосов
/ 17 июня 2011

У меня есть следующий запрос в 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, но часть "Cid"анонимного типа с комбинацией ToList() (ToList () вызвал исключение - это упрощенный тестовый случай без условия WHERE) завершается ошибкой с исключением:

Невозможно создать постоянное значение типа 'System.Object.В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Почему это так или я что-то здесь упускаю?

1 Ответ

3 голосов
/ 17 июня 2011

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