当一个表没有另一个表的定义时,如何连接两个表

时间:2016-06-09 09:00:47

标签: asp.net-mvc linq

编辑:这是实体数据类

public abstract class EntityData : ITableData
{
    protected EntityData();

    public DateTimeOffset? CreatedAt { get; set; }
    public bool Deleted { get; set; }
    [Key]
    public string Id { get; set; }
    public DateTimeOffset? UpdatedAt { get; set; }
    public byte[] Version { get; set; }
}

我有一个看起来像这样的销售模型

 public class Sale : EntityData
 {
      public string StoreId { get; set; }
      [StringLength(255)]
      public string Remarks { get; set; }
      public string SaleTransactionId { get; set; }

      public virtual Store Store { get; set; }
 }

我使用LINQ语句来获取所有内容,但我也试图从PartNumber表中获取Products

 private MobileServiceContext context;

 var query = context.Sales             
      .Where(s =>
      (String.IsNullOrEmpty(storeName) || s.Store.StoreName.Contains(storeName)) &&
      (String.IsNullOrEmpty(productPartNumber) || s.Product.PartNumber.Contains(productPartNumber)) &&
      (String.IsNullOrEmpty(remarks) || s.Remarks.Contains(remarks)) &&
      (String.IsNullOrEmpty(saletransactionId) || s.SaleTransactionId.Contains(saletransactionId)) );

在没有声明PartNumber的情况下,有没有办法从Products获取public virtual Product Product { get; set; }

编辑:我已经尝试了.Inlude(),但没有运气

2 个答案:

答案 0 :(得分:0)

您提出的方式有点令人困惑。

每次销售都有许多产品,通常不只是一种。

我猜你的SaleTransactionId是你的销售的唯一标识符,它实际上是一个Guid。如果是这种情况,则应将其称为SaleId,否则您的对象应称为SaleTransaction。这样你的意图很明确,你知道每个领域代表什么。

这通常是使用Code第一种方法的缺点之一。

无论如何,继续前进,您需要能够将销售链接到产品或产品列表,所以是的,您需要在Sale对象中使用它。

我不明白您的SaleTransactionId如何为空或空。当然它总是填充,否则就不会成为交易。

答案 1 :(得分:0)

我明白了。只需添加.Include

即可
 var query = context.Sales   
      .Include(p => p.Product)          
      .Where(s =>
           (String.IsNullOrEmpty(storeName) || s.Store.StoreName.Contains(storeName)) &&
           (String.IsNullOrEmpty(productPartNumber) || s.Product.PartNumber.Contains(productPartNumber)) &&
           (String.IsNullOrEmpty(remarks) || s.Remarks.Contains(remarks)) &&
           (String.IsNullOrEmpty(saletransactionId) || s.SaleTransactionId.Contains(saletransactionId)));