2016-08-11 25 views
1

私は、Entity Frameworkのにかなり新しいよ、私のテーブルの関係は少しこのEFコア関係クエリ

public class Customer { 
    public int Id { get; set; } 
    public string Name { get; set; } 

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

public class Product { 
    public int Id { get; set; } 

    public int CustomerId { get; set; } 
    public Customer Customer { get; set; } 

} 

のように見える私はCustomerテーブルにクエリをしたいとMAX作成しただけで、最後の製品が含まれます(同上)

通常のSQLクエリは

...私の現在のEFのクエリは次のようになりますが、それはすべての製品を返すこの

SELECT * 
FROM Customer 
INNER JOIN Product ON Customer.Id = Product.CustomerId 
WHERE Product.Id = (SELECT MAX(Id) FROM Product WHERE CustomerId = Customers.Id) 

ようになります。

List<Customer> customers = _context.Customers 
       .Include(c => c.Products) 
       .ToList(); 

私は私の右の結果が得られ、このような何かを試してみましたが、EFは、クエリの束を作り、非常に迅速に、私はこれは私がいくつかをしたいと思い、それ

List<Customer> customers = _context.Customers 
       .Select(c => new Customer() { 
        Id = c.Id, 
        Name = c.Name, 
        c.Products = c.Products.Where(d => d.Id == c.Products.Max(max => max.Id)).ToList() 
       }).ToList(); 

で行くことに間違った方法のように思える見ます提案、またはこれを行うための別の方法がある場合は、

答えて

1

それは仮定すると、顧客名が必要です

SELECT TOP 1 * 
FROM Customer 
INNER JOIN Product ON Customer.Id = Product.CustomerId 
Order by Product.Id desc 

としてこれを書くことができ

SELECT * 
FROM Customer 
INNER JOIN Product ON Customer.Id = Product.CustomerId 
WHERE Product.Id = (SELECT MAX(Id) FROM Product WHERE CustomerId = Customers.Id) 

異なる方法で記述することができ、クエリ、以下のようになりますを使用するのであるとし上記のクエリは、LINQで記述するか、または以下のようにEFを使用して書くことができます。

var customers = _context.Customers.Join(_context.Products, cu => cu.id, 
p => p.CustomerId, (cu,p) => new { cu,p}) 
.Select(c => new { prodId = c.p.Id,customername = c.cu.Name }) 
.OrderByDescending(c => c.prodId).Take(1); 
+0

ああ、あなたは私の結合を正しく使う方法を教えてくれました!私はOrderByDescending()で望みの結果を得ることができませんでしたが、私は.Where(c => cpId == c.cu.Product.Max(max => max.Id))に置き換えました。今、EFは私が望んでいたクエリを生成します!ありがとう – Marc

0

あなたはSQLが使用「クエリ構文」を照会すると、ちょうど似て使用したい場合は

がちょうど Query syntax

として使用Entity Frameworkの中でクエリを作成する.NET(LINQ)でサポートされている構文の2種類があります
from cus in customers select cust; 

Method syntax

customers.where(s=>s.name == "ali").toList; 

結果を保持するためにvarを使用してください。 私は、あなたがよくlambda expressions