2015-07-17 2 views
0

у меня есть две таблицы (продукта и обзор)Linq данные из двух таблицы с агрегатными функциями

Продукт

ProductId 
ProductName 
ImagePath 
CategoryID 

Обзор

ReviewId 
ProductId 
ReviewText 

Я хочу получить набор результатов, который покажет productName, ImagePath и общий обзор продукта.

Я пишу SQL-запрос для этого, как этот

select ProductName, ImagePath,COUNT(rw.ProductId) TotalReview 
from Product pr join Review rw on pr.ProductId = rw.ProductId 
where pr.CategoryID=1 
group by ProductName, ImagePath 

Пожалуйста, помогите.

+2

Вы пишете запрос linq или sql-запрос? – Rohit

+0

Просто измените 'join' на' internal join' и удалите группу –

+0

@HosseinNarimaniRad присоединяйтесь без дополнительных модификаторов _is_ к внутреннему соединению. – Silvermind

ответ

1

Это EF Linq код запроса

var query = from p in db.Products 
      where p.CategoryID = 1 
      select new { 
      Name = p.ProductName, 
      ImagePath = p.ImagePath, 
      TotalReviews = p.Reviews.Count()     
      }; 

    var results = query.ToList(); 
+0

Где вторая таблица (Отзывы)? – Arvind

+0

Используя EF (Entity Framework), вы указали эту ссылку. y0uri в ответе ниже показывает, как сделать это сопоставление. Мой ответ предоставляет вам запрос Linq для ответа. – Dryadwoods

+0

Строка TotalReviews = p.Reviews.Count() дает ошибку следующим образом. \t «Reviewer.Product» не содержит определения для «Обзоров» и никакого метода расширения «Обзоры», принимающие первый аргумент типа «Reviewer.Product», могут быть найдены (вам не хватает директивы использования или ссылки на сборку? – Arvind

0

Вы будете любить, чтобы сделать это с Entity Framework: Если вы еще не сделали этого, добавьте Entity Framework NuGet пакет для вашего проекта.

Затем добавьте следующие классы:

[Table("Product")] 
public class Product 
{ 
    [Key] 
    public int ProductId {get;set;} 
    public string ProductName {get;set;} 
    public string ImagePath {get;set;} 

    [InverseProperty("Product")] 
    public virtual ICollection<Review> Reviews {get;set;} 
} 

[Table("Review") 
public class Review 
{ 
    [Key] 
    public int ReviewId {get;set;} 
    public int ProductId {get;set;} 
    public string ReviewText {get;set;} 

    [ForeignKey("ProductId")] 
    public virtual Product Product {get;set;} 
} 

public class YourDbContext : DbContext 
{ 
    static YourDbContext() 
    { 
     //This prevents your database to be created or updated by EF 
     //I prefer to keep the hand on my db 
     Database.SetInitializer<YourDbContext>(null); 
    } 

    public YourDbContext() 
     //The name value is the name of your connectionstring (in App.config or Web.config) 
     //<configuration><connectionStrings><add ... 
     : base("Name=YourDbContext"){} 

    public DbSet<Product> Products {get;set;} 
} 

Вы можете получить доступ к вашей продукции с:

var dbContext = new YourDbContext(); 
var allProjects = dbContext.Projects; 
var specificProject = dbContext.Projects.Where(p => p.ProductId == 5); 

//Related Reviews will be availlable here 
var specificReviews = specificProject.Reviews; 

Удачи!

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