【问题标题】:Entity Framework - Get Records : Comma separated string (or List<string>) is contained within a collection of entities实体框架 - 获取记录:逗号分隔的字符串(或 List<string>)包含在实体集合中
【发布时间】:2021-08-24 07:39:39
【问题描述】:

给定实体

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public ICollection<Category> Categories { get; set; }
}

public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public ICollection<Product> Products { get; set; }
}

我想查询 Products 表以检索具有以逗号分隔列表形式给出的任何类别的产品。

因此,例如,我想获得类别为“电子产品”和/或“厨房设备”的产品

如果它不是一个集合,我会这样做:例如

Products.Where(p => "Oven,Kettle".Contains(p.ProductName));

但这显然行不通:

Products.Where(p => "Electronics,Kitchen Equipment".Contains(p.Categories.CategoryName));

也试过了:

Products.Where(p => "Electronics,Kitchen Equipment".Any(x => p.Categories.Any(pcat => pcat.CategoryName == x.ToString()))).Take(100);

【问题讨论】:

    标签: c# linq entity-framework-core


    【解决方案1】:

    您必须将 IEnumerable 传递给 Where 子句:

    var names = "Oven,Kettle".Split(',');
    var query = Products.Where(p => names.Contains(p.ProductName));
    

    【讨论】:

    • 如果我正在寻找单个文本字段,我会这样做。我希望将任何逗号分隔的字符串与任何集合项匹配。感谢您花时间回答我的问题!
    【解决方案2】:
    var categories = new[] { "Electronics", "Kitchen Equipment" };
    
    var productsQuery = Products
        .Where(p => p.Categories.Any(pcat => categories.Contains(pcat.CategoryName)))
        .Take(100);
    

    【讨论】:

    • 注意:如果列表是 { "Electronics", "Kitchen Equipment", "Kitchen" },它可能会给出不正确的结果,因为 Contains 将匹配 "Kitchen Equipment" 和 "Kitchen"。 (在试图只找到“厨房”的搜索中)
    • @AlfNielsen 不,categories 是一个数组,所以Enumerable.Contains 将检查是否相等。如果categories 被定义为字符串,即var categories = "Electronics, Kitchen Equipment";,那么您的观点将是有效的。
    • 啊,是的,你在这里是对的。当数据库包含逗号分隔列表(不是实际列表)时,我正在寻找解决方案,这将出现我描述的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多