2015-11-06 4 views
0

У меня есть ниже код, где я использую рамки сущности,Как объединить несколько таблиц в рамках сущности

public IEnumerable<Product> GetProducts() 
{ 
    var query = (from p in db.Products 
        join pd in db.ProductDetails 
         on p.ProductID equals pd.ProductID 
        select new 
        { 
         p.ProductName, 
         pd.IsEnabled 
        }).ToList(); 

     IEnumerable<Product> products = 
      db.Products.Include(x => x.ProductDetail).ToList(); 

     return products; 
} 


public partial class Product 
{ 
    public int ProductID { get; set; } 
    public string ProductName { get; set; } 
    public System.DateTime CreatedDate { get; set; } 

    public virtual ProductDetail ProductDetail { get; set; } 
} 

Вместо возврата данных только из таблицы Products, я хочу, чтобы вернуть данные из таблицы, а также Детали изделия.

Кроме того, если я хочу добавить здесь предложение, как бы я это сделал?

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

public IEnumerable<ProductEnableInfo> GetProducts(int pid) 
{ 
    return db.Products.Select(x => new ProductEnableInfo 
           { ProductId = x.ProductID, 
            ProductName = x.ProductName, 
            IsEnabled = x.ProductDetail.IsEnabled 
           }).Where(x => x.ProductId == pid) .ToList(); 
} 

Как я могу это сделать?

+0

Можете ли вы описать, какие именно данные вы хотите запросить? –

+0

Мне нужна таблица ProductName from Products и IsEnabled из таблицы ProductDetails. – AMeh

+0

Вы уже делаете это в первом запросе –

ответ

2

Вы можете создать собственный класс, чтобы держать только ProductName и IsEnabled вроде этого:

public class ProductEnableInfo 
{ 
    public string ProductName { get; set; } 
    public bool IsEnabled { get; set; } 
} 

Затем вы можете изменить свой метод следующим образом:

public IEnumerable<ProductEnableInfo> GetProducts() 
{ 
    return db.Products.Select(
     x => new ProductEnableInfo 
     { 
      ProductName = x.ProductName, 
      IsEnabled = x.ProductDetail.IsEnabled 
     }) 
     .ToList(); 
} 

UPDATE:

Вы можете фильтровать по ProductID следующим образом:

public IEnumerable<ProductEnableInfo> GetProducts(int product_id) 
{ 
    return db.Products 
     .Where(x => x.ProductID == product_id) 
     .Select(
     x => new ProductEnableInfo 
     { 
      ProductName = x.ProductName, 
      IsEnabled = x.ProductDetail.IsEnabled 
     }) 
     .ToList(); 
} 
+0

Вы можете иметь 'Where' до или после' Select'. Если вы делаете это раньше, у вас есть возможность фильтровать на основе любого свойства 'Product'. Если вы это сделаете, вы можете фильтровать только на основе «ProductName» или «IsEnabled». –

+0

Если я верну продукт productid, как я могу его отфильтровать (что будет предложением where)? – AMeh

+0

Вы хотите включить ProductId в результат? Кроме того, вы хотите отфильтровать на основе некоторого ProductId? –

1

Вы можете создать DTO объект и используя Select() метод, вы могли бы изменить результат запроса, для образца:

public class ProductDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool IsEnalbed { get; set; } 
} 

И выполнить запрос, как это;

IEnumerable<ProductDto> result = db.Products  
            .Where(x => x.ProductId == productId) // if you want to filter, just add .Where() method         
            .Select(x => new ProductDto() 
              { 
              Id = x.ProductID, 
              Name = x.ProductName, 
              IsEnabled = x.ProductDetail.IsEnabled 
              }) 
            .ToList(); 
+0

'.Include' не требуется –

1

Это должно дать вам то, что вам нужно.

public IEnumerable<Product> GetProducts() 
{ 
    IEnumerable<Product> products = 
     db.Products.Include(x => x.ProductDetail).ToList(); 

    return products; 
} 

, чтобы получить доступ к IsEnabled собственности вы просто ссылаться на свойству ProductDetail

var products = GetProducts(); 
foreach (var product in products) 
{ 
    bool enabled = product.ProductDetail.IsEnabled; 
} 
Смежные вопросы