gpt4 book ai didi

asp.net-mvc - EF 查找不在列表中的实体

转载 作者:行者123 更新时间:2023-12-04 02:13:46 26 4
gpt4 key购买 nike

我有这个实体:

产品

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

价目表

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

价格表产品

public class PriceListProduct 
{
public int Id { get; set; }
public int PriceListId { get; set; }
public int ProductId { get; set; }

public virtual Product Product { get; set; }
}

问题是,如何使用 LINQ 获取不在价目表中的产品?

我首先想到的是使用Contains,但是产品列表可能大于100000,如果将Contains翻译成像WHERE NOT IN子句这样的查询,SQL有大约2000个参数的限制,所以除了性能,我认为这不是最好的方法。

还有别的办法吗?我应该使用原始查询吗?

更新#1

我正在尝试理解@Indregaard 回答后的 GroupJoin。到目前为止,我有这个。

var productsWithNoPrice = db.Product()
.GroupJoin(db.PriceListProduct().Where(plp => plp.PriceListId == 2)
.Select(plp => plp.Product),
p => p.Id,
plp => plp.Id,
(p, product) => new { p.Id, Product = product })
.Where(p => !p.Product.Any())
.Select(p => p.Product);

过滤条件

.Where(plp => plp.PriceListId == 2)

我正在从 ID 为 2 的价目表中筛选产品。我认为这很接近,但 SQL 生成的查询返回的行数对应于价目表中不存在的产品数量,但每一列都是空。

基本上我需要的是这样的查询

select * from Product p
left join PriceListProduct plp on plp.ProductId = p.Id and plp.PriceListId = 2
where plp.Id is null

最佳答案

所以你在找Antijoin .

手动方法可能是这样的:

var query = 
from p in db.Products
join plp in db.PriceListProducts
on p.Id equals plp.ProductId into priceLists
where !priceLists.Any()
select p;

另一种方式:

var query = db.Products
.Where(p => !db.PriceListProducts.Any(plp => p.Id == plp.ProductId));

但最好的方法是在模型中创建所有导航属性

public class Product 
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<PriceListProduct> PriceLists { get; set; }
}

让 EF 为您创建查询

var query = db.Products.Where(p => !p.PriceLists.Any());

关于asp.net-mvc - EF 查找不在列表中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35859995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com