2015-09-22 50 views
2

什麼,我基本上是試圖做的是讓所有還沒有被分配一個包位置的價格爲特定位置的包...SQL轉換爲C#實體框架的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?下面是我的架構...的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; } 
} 

包位置價格實體:

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(); 

如果你想爲結果都PackagePackageLocationPrice,然後執行此操作:

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

有了這個la st查詢您將獲得PackageLocationPrice的列表,如果您想要查看給定的PackageLocationPrice的相關Package,則可以使用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查詢完全相同的內容。