Я новичок в EF. Чтобы было проще, скажем, до недавнего времени у меня была такая таблица
CREATE TABLE customer
(
CustomerNumber int,
CustomerName nvarchar(100)
)
У меня был класс, чтобы справиться с этим
[Table("customer")]
public class Customer
{
[Key]
public int CustomerNumber { get; set; }
public string CustomerName { get; set; }
}
С контекстом:
public class MyContext : DbContext
{
public MyContext()
: base("name=MyContext")
{
}
public DbSet<Customer> Customers { get; set; }
}
С контроллером:
public class CustomersController : ODataController
{
MyContext db = new MyContext();
private bool CustomerExists(string key)
{
return db.Customers.Any(p => p.CustomerNumber == key);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
[EnableQuery(PageSize =20)]
public IQueryable<Customer> Get()
{
db.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
return db.Customers;
}
[EnableQuery]
public SingleResult<Customer> Get([FromODataUri] string key)
{
IQueryable<Customer> result = db.Customers.Where(p => p.CustomerNumber == key);
return SingleResult.Create(result);
}
}
Недавно у меня появилась новая таблица с новыми данными для отображения.
CREATE TABLE customerDetails
(
CustomerNumber int,
Role nvarchar(20),
ContactName nvarchar(30)
)
Для каждого номера клиента в таблице customerDetails есть 2 записи, различающиеся по роли, скажем, A
и B
.
Я пытаюсь получить результат следующего запроса в мою измененную сущность
Запрос:
SELECT c.CustomerNumber, c.CustomerName, cc1.ContactName as A_Name, cc2.ContactName as B_Name
FROM customer as c
JOIN customerDetails as cc1 ON c.CustomerNumber = cc1.CustomerNumber AND cc1.Role = 'A'
JOIN customerDetails as cc2 ON c.CustomerNumber = cc2.CustomerNumber AND cc2.Role = 'B'
Я изменил свою сущность:
[Table("customer")]
public class Customer
{
[Key]
public int CustomerNumber { get; set; }
public string CustomerName { get; set; }
public string A_Name { get; set; }
public string B_Name { get; set; }
}
Добавлено:
[Table("customerDetails")]
public class Customer
{
[Key]
public int CustomerNumber { get; set; }
public string Role { get; set; }
public string ContactName { get; set; }
}
И модифицированный контроллер:
[EnableQuery(PageSize =20)]
public IQueryable<Customer> Get()
{
db.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
return from c in db.Customers
join cc1 in db.CustomerContacts.Where(e => e.Role == "A") on c.CustomerNumber equals cc1.CustomerNumber
join cc2 in db.CustomerContacts.Where(e => e.Role == "B") on c.CustomerNumber equals cc2.CustomerNumber
select c;
}
Но он возвращает пустой набор. Как я могу правильно написать это утверждение select и заполнить мою измененную Customer
сущность?