繁体   English   中英

EF Core Any in Any客户端评估

[英]EF Core Any in Any client side evaluation

我有包含Product ID的OrderInfo列表。 我要加载的所有Order S(有List<Many2Many>内),其中有至少一个ProductId从我的OrderInfo列表

基本上是嵌套的Any Any

我在下面编写的作为概念证明的代码可以很好地工作,但是问题是,当我尝试在EF Core上执行相同的操作时,它将在客户端进行评估。

如何使其正确评估?

var list_of_details = new List<OrderInfo> {...};

context
.Orders
.Where(o => o.OrdersProducts.Any(p => list_of_details.Any(d => d.ProductId == p.ProductId)));

public class OrderInfo
{
    public Guid ProductId { get; set; }
    (...)
}

public class Order
{
    public List<Many2Many> OrdersProducts = new List<Many2Many>();
    (...)
}

public class Product
{
    public List<Many2Many> OrdersProducts = new List<Many2Many>();
    (...)
}

public class Many2Many
{
    public Order Order { get; set; }
    public Guid OrderId { get; set; }
    public Product Product { get; set; }
    public Guid ProductId { get; set; }
}

这是非ef方式的示例,但是很丑陋,只是作为概念的证明

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public class OrderInfo
    {
        public int ProductId { get; set; }
    }

    public class Order
    {
        public int Id;
        public List<Many2Many> OrdersProducts = new List<Many2Many>();
    }


    public class Product
    {
        public int Id;
        public List<Many2Many> OrdersProducts = new List<Many2Many>();
    }

    public class Many2Many
    {
        public Order Order { get; set; }
        public int OrderId { get; set; }
        public Product Product { get; set; }
        public int ProductId { get; set; }
    }


    public static void Main()
    {
        Console.WriteLine("List of ids that have to be in 'Order' in order to qualify him");
        var list_of_details = Enumerable.Range(0, 5).Select(x => new OrderInfo(){ ProductId = x}).ToList();

        foreach (var item in list_of_details)
        {
            Console.Write(item.ProductId);
        }

        Console.WriteLine();

        // setup
        var orders = new List<Order>();
        var order = new Order(){Id = 2};

        var product = new Product()
        {
            Id = 3,
        };

        order.OrdersProducts.Add(new Many2Many()
        {
            Order = order,
            OrderId = order.Id,
            Product = product,
            ProductId = product.Id
        });

        var order2 = new Order(){Id = 3};
        var product2 = new Product()
        {
            Id = 4,
        };

        order2.OrdersProducts.Add(new Many2Many()
        {
            Order = order2,
            OrderId = order2.Id,
            Product = product2,
            ProductId = product2.Id
        });


        var order3 = new Order(){Id = 1};
        var product3 = new Product()
        {
            Id = 5,
        };

        order3.OrdersProducts.Add(new Many2Many()
        {
            Order = order3,
            OrderId = order3.Id,
            Product = product3,
            ProductId = product3.Id
        });


        orders.Add(order);
        orders.Add(order2);
        orders.Add(order3);
        Console.WriteLine();

        // end setup

        foreach (var ord in orders)
        {
            Console.WriteLine();
            Console.WriteLine($"Order Id: {ord.Id}");
            Console.Write('\t' + "Product Ids: ");
            foreach (var prod in ord.OrdersProducts)
            {
                Console.Write(prod.ProductId);
            }
        }

        Console.WriteLine();
        Console.WriteLine();        
        Console.WriteLine("found orders");
        foreach (var item in orders.Where(o => o.OrdersProducts.Any(p => list_of_details.Any(d => d.ProductId == p.ProductId))))
        {
            Console.WriteLine(item.Id);
        }
    }
}

输出:

List of ids that have to be in 'Order' in order to qualify him
01234


Order Id: 2
   Products Ids: 3
Order Id: 3
   Products Ids: 4
Order Id: 1
   Products Ids: 5

found orders
2
3

一种方法是将列表简化为id,

var list_of_details = new List<OrderInfo> {...};
var orderInfoIds = list_of_details.Select(d => d.ProductId);
context
.Orders
.Where(o => o.OrdersProducts.Any(p => orderInfoIds.Contains(p.ProductId)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM