EFコア関係クエリ

asp.net-core c# entity-framework-core

質問

私はEntity Frameworkをかなり新しくしています。私のテーブル関係はちょっとこのように見えます

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; }

}

私は、顧客テーブルのクエリを作成し、MAX(Id)で作成された最後の製品のみを含めたいと思います。

通常のSQLクエリは次のようになります

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

現在のEFクエリはこのように見えますが、すべての製品が返されます...

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

私はいくつかの提案をしたい、あるいはこれを実現させる別の方法がある場合。

受け入れられた回答

以下のようなクエリは、別の方法で記述することができます

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

これは次のように書くことができます。

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

顧客名が必要であると仮定すると、上記のクエリはLINQで書くことができます。

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

人気のある回答

Entity Frameworkでクエリを作成するには、.NET(LINQ)でサポートされる構文の2種類があります。

SQLクエリと同じように使用したい場合は「クエリ構文」を使用し、 クエリ構文として使用します

    from cus in customers select cust;

メソッド構文

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

結果を保持するには、 varを使用します。あなたはラムダ式をよく使うと思います



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ