У меня есть два запроса linq (к EF4), которые возвращают разные результаты. Первый запрос содержит правильные результаты, но не отформатирован/спроецирован правильно.
Второй запрос - это то, что я хочу, но в нем отсутствуют некоторые данные.
схема
альтернативный текст http://img220.imageshack.us/img220/9678/schema.png
Запрос 1
var xxxx = (from cp in _connectedClientRepository
.GetConnectedClients(new[] { "LogEntry", "LogEntry.GameFile" })
.AsExpandable()
.Where(predicate)
select cp)
.ToList();
альтернативный текст http://img231.imageshack.us/img231/6541/image2ys.png
Обратите внимание на свойство GameFile
. Это не нуль. Это здорово :) Обратите внимание на запрос linq? Я хочу загрузить LogEntry
и затем загрузить GameFile
(для каждого загруженного LogEntry).
Это то, что мне нужно → для каждого LogEntry
который загружен с нетерпением, пожалуйста, GameFile
загрузите GameFile
. Но этот результат проекции неверен...
Хорошо.. дальше...
Запрос 2
var yyy = (from cp in _connectedClientRepository
.GetConnectedClients(new[] { "LogEntry", "LogEntry.GameFile" })
.AsExpandable()
.Where(predicate)
select cp.LogEntry)
.ToList();
ПРИМЕЧАНИЕ: изображение выше содержит опечатку... обратите внимание, что типизированный код включаемых ассоциаций является правильным (т. LogEntry.GameFile
), в то время как изображение имеет опечатку.
Правильная проекция сейчас → все результаты LogEntries
. Но обратите внимание, что свойство GameFile
теперь имеет значение null? Я не уверен, почему :( Я думал, что я правильно загрузил правильную цепочку. Так что это правильная проекция, но с неверными результатами.
Обязательный код репозитория.
public IQueryable<ConnectedClient> GetConnectedClients(
string[] includeAssociations)
{
return Context.ConnectedClients
.IncludeAssociations(includeAssociations)
.AsQueryable();
}
public static class Extensions
{
public static IQueryable<T> IncludeAssociation<T>(
this IQueryable<T> source, string includeAssociation)
{
if (!string.IsNullOrEmpty(includeAssociation))
{
var objectQuery = source as ObjectQuery<T>;
if (objectQuery != null)
{
return objectQuery.Include(includeAssociation);
}
}
return source;
}
public static IQueryable<T> IncludeAssociations<T>(
this IQueryable<T> source, params string[] includeAssociations)
{
if (includeAssociations != null)
{
foreach (string association in includeAssociations)
{
source = source.IncludeAssociation(association);
}
}
return source;
}
}
Обновления
- 1: исправлена ошибка, замеченная в примерах кода.
- 2: Добавлен код репозитория, чтобы помочь любому, кто запутался.