База данных
Код: Выделить всё
CREATE TABLE [dbo].[UserDetail]
(
[UserId] [int] NOT NULL PRIMARY KEY,
[Name] varchar(100) NULL
)
CREATE TABLE [dbo].[User]
(
[UserId] [int] NOT NULL PRIMARY KEY
)
Код: Выделить всё
[Table("UserDetail"), Schema="dbo"]
public class UserDetail
{
[Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int UserId { get; set; }
public string Name { get; set; }
// Additional Properties Not Listed
}
[Table("User"), Schema="dbo"]
public class User
{
[Key, Required]
public int UserId { get; set; }
// Additional Properties Not Listed
[ForeignKey("UserId")]
public virtual UserDetail UserDetail { get; set; }
}
Код: Выделить всё
IQueryable users = DataRepository.UserRepository.List(); // 'List()' returns an IQueryable
Код: Выделить всё
users = users.Where(m => m.UserDetail == null); // Also tried (m => m.UserDetail.Equals(null))
var testing = users.ToList();
Код: Выделить всё
users = users.Where(m => m.UserDetail.Name == "UserName");
var testing = users.ToList();
В окончательном тесте решено попробовать использовать метод Include и посмотреть, имеет ли это значение, но он дал тот же результат, что и первый тест (т. е. пустой):
Код: Выделить всё
users = users.Include(m => m.UserDetail).Where(m => m.UserDetail == null);
var testing = users.ToList();
Я думаю, что запрос IQueryable переводит свойства навигации как 'JOIN'(s) а не 'LEFT JOIN'(ы) и, следовательно, не может использоваться для сравнения пустых/нулевых связанных записей (записей просто нет).
Подводя итог вопросам:
- Как написать запрос в .NET/Entity Framework, который будет выполняться в базе данных, чтобы извлекать только «Пользователей», у которых нет связанной записи «UserDetail» ?
- Почему IQueryable не извлекает записи, которые я ожидал в своем первом тесте?
- Уточните все общие моменты, которые я упускаю в отношении функциональности IQueryable.
Подробнее здесь: https://stackoverflow.com/questions/720 ... n-property
Мобильная версия