2015-09-22 3 views
2

То, что я в основном пытаюсь сделать, это получить все пакеты, которые не были назначены пакетной цена местоположения для конкретного места ...Преобразования SQL в C# Entity Framework Linq

У меня есть следующий SQL:

SELECT * FROM Package 
    LEFT JOIN PackageLocationPrices ON Package.Id = PackageLocationPrices.PackageId 
    Where PackageLocationPrices.LocationId IS NULL 

Как я могу преобразовать это в Linq в объекты?

Я пытался что-то вроде этого:

this.db.Packages.Include(p => p.PackageLocationPrices).Where(p => p.Id == p.PackageLocationPrices.????).ToList(); 

Я могу присоединиться пакет цены местоположение, но я не смог получить свойства packagelocationprices сделать SQL выше? Ниже моя схема ... The PackageLocationPrices.PackageId является внешним ключом Package.Id

enter image description here

Пакет Entitiy:

public partial class Package 
{ 
    public Package() 
    { 
     this.DiscountCodes = new HashSet<DiscountCode>(); 
     this.PackageLocationPrices = new HashSet<PackageLocationPrice>(); 
     this.Memberships = new HashSet<Membership>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public int PackageOrder { get; set; } 
    public int PackageTypeId { get; set; } 
    public int PackagePeriodDays { get; set; } 
    public int PackagePeriodMonths { get; set; } 
    public int PackageSuspensionLimit { get; set; } 
    public int PackageSuspensionLimitIfAdminOverride { get; set; } 
    public int PackageSuspensionMinLength { get; set; } 
    public int PackageSuspensionMaxLength { get; set; } 
    public int PackageSuspensionsMaxLengthCombined { get; set; } 
    public int PackagePaymentHolidayLimit { get; set; } 
    public int PackagePaymentHolidayMinLength { get; set; } 
    public int PackagePaymentHolidayMaxLength { get; set; } 
    public int PackageVisitLimit { get; set; } 
    public bool PackageIsActive { get; set; } 
    public bool PackageIsReoccuring { get; set; } 
    public bool PackagePayInFull { get; set; } 
    public bool PackageIsSession { get; set; } 
    public System.DateTime CreatedDate { get; set; } 
    public System.DateTime ModifiedDate { get; set; } 
    public string CreatedBy { get; set; } 
    public string ModifiedBy { get; set; } 

    public virtual AspNetUser AspNetUserCreatedBy { get; set; } 
    public virtual AspNetUser AspNetUserModifiedBy { get; set; } 
    public virtual ICollection<DiscountCode> DiscountCodes { get; set; } 
    public virtual PackageType PackageType { get; set; } 
    public virtual ICollection<PackageLocationPrice> PackageLocationPrices { get; set; } 
    public virtual ICollection<Membership> Memberships { get; set; } 
} 

Пакет Местоположение Цена Entity:

public partial class PackageLocationPrice 
{ 
    public int Id { get; set; } 
    public int LocationId { get; set; } 
    public int PackageId { get; set; } 
    public decimal MonthlyPrice { get; set; } 
    public decimal TotalPrice { get; set; } 
    public System.DateTime CreatedDate { get; set; } 
    public System.DateTime ModifiedDate { get; set; } 
    public string CreatedBy { get; set; } 
    public string ModifiedBy { get; set; } 

    public virtual AspNetUser AspNetUserCreatedBy { get; set; } 
    public virtual AspNetUser AspNetUserModifiedBy { get; set; } 
    public virtual Location Location { get; set; } 
    public virtual Package Package { get; set; } 
} 
+0

Не могли бы вы показать свои сущности? – octavioccl

+0

Простите меня, что я относительный новичок MVC. Какую часть вы хотели, чтобы я вам показал? Я использую первую модель базы данных. –

+0

db.Database.SqlQuery (querytext) –

ответ

0

Я думаю, что вы можете создать свой запрос с другой точки зрения:

var query=(from pl in db.PackageLocationPrices 
      where pl.LocationId == null 
      select pl.Package).ToList(); 

Если вы отключили отложенной загрузки, то необходимо также использовать метод Include расширения:

var query=(from pl in db.PackageLocationPrices.Include(p=>p.Package) 
      where pl.LocationId == null 
      select pl.Package).ToList(); 

Использование синтаксиса метода будет так:

var query=db.PackageLocationPrices.Include(p=>p.Package) 
            .Where(pl=>pl.LocationId == null) 
            .Select(pl=>pl.Package) 
            .ToList(); 

Если вы хотите, как результат, как Package и PackageLocationPrice, затем выполните следующие действия:

var query=db.PackageLocationPrices.Include(p=>p.Package) 
            .Where(pl=>pl.LocationId == null) 
            .ToList(); 

С этим la st запрос, вы получите список PackageLocationPrice, и если вы хотите увидеть связанный Package для данного PackageLocationPrice, вы можете использовать свойство навигации Package.

+0

Благодарим вас за это. Очень полезно. Каким будет результат объекта? Я предполагаю, что это не будет цена пакета или пакета. Должен ли я связать результаты с пользовательской моделью, прежде чем передать ее на мой взгляд? –

+1

Вы получите из этого запроса список пакетов. Если вы хотите, вы также можете создать собственный класс, чтобы сохранить проекцию вашего запроса и использовать результат в своем представлении – octavioccl

1
var result = (from p in Package 
      join q in PackageLocationPrices on p.Id equals q.PackageId into pq 
      from r in pq.DefaultIfEmpty() 
      select new {p, r}).ToList(); 

Это должно вернуть что-то точно так же, как и ваш SQL-запрос.

Смежные вопросы