使用 LINQ 根据外键值计算总数

Posted

技术标签:

【中文标题】使用 LINQ 根据外键值计算总数【英文标题】:Count total based on a foreign key value using LINQ 【发布时间】:2018-12-29 04:56:39 【问题描述】:

我正在尝试在 SQL 中执行以下操作

SELECT COUNT(*) AS "Total" 
FROM dbo.Items
WHERE CategoryID IN (SELECT CategoryID 
                     FROM Categories
                     WHERE Name = 'Beverages')    

任何想法我们如何在LINQ 中实现这一点?

*更新

Item类代码:

public class Item
    
        [Key]
        public int ItemID  get; set; 
        public virtual Category Category  get; set; 
        public virtual Brand Brand  get; set; 
        public int CategoryID  get; set; 
        public int BrandID  get; set; 
        [Display(Name ="Product Name")]
        [Required(ErrorMessage = "Product name is required")]
        public string ItemName  get; set; 
        [Display(Name="Product Price")]        
        public decimal? ItemPrice  get; set; 

        [DataType(DataType.ImageUrl)]
        [Display(Name = "Image URL")]
        public string ImageUrl  get; set;      

    

Category类代码:

public class Category
    
        public int CategoryID  get; set; 
        [DisplayName("Category Name")]
        public virtual string Name  get; set; 
        public virtual List<Item> Items  get; set; 
    

【问题讨论】:

分类表的主键是什么 CategoryId 的类型应该是 int 不能为空的 int? 您认为这可能是导致问题的原因吗? 是的,试着把它改成int 对不起兄弟,同样的错误信息:LINQ to Entities does not recognize the method 'OnlineStore.Models.Category get_Item(Int32)' method, and this method cannot be translated into a store expression. 【参考方案1】:

更新 型号

public class Item

    [Key]
    public int ItemID  get; set; 
    public Category Category  get; set; 
    public int CategoryID  get; set; 
    public int BrandID  get; set; 
    [Display(Name = "Product Name")]
    [Required(ErrorMessage = "Product name is required")]
    public string ItemName  get; set; 
    [Display(Name = "Product Price")]
    public decimal? ItemPrice  get; set; 

    [DataType(DataType.ImageUrl)]
    [Display(Name = "Image URL")]
    public string ImageUrl  get; set; 



public class Category

    [Key]
    public int CategoryID  get; set; 
    public virtual string Name  get; set; 
    public virtual List<Item> Items  get; set; 

使用的数据样本

您想要商品的类别 = 饮料 你可以从items结束

var itemsCount1 = dbcontext
    .Items
    .Count(x => x.Category.Name == "Beverages");

你可以从categories结束

//如果没有名称为Beverages的Category,则返回0

var itemsCount2 = dbcontext
    .Categories
    .FirstOrDefault(x => x.Name == "Beverages")?.Items?.Count() ?? 0;

查询结果

【讨论】:

CS1061 'Items' 不包含 'Categories' 的定义,并且找不到接受“Items”类型的第一个参数的扩展方法 'Categories'(按 F4 添加 using 指令或程序集参考) 在您的类别模型中,您应该有导航属性 List 我尝试了你给出的第一个代码示例......即来自items 对于您给出的第二个示例 - 错误消息:LINQ to Entities does not recognize the method 'OnlineStore.Models.Category get_Item(Int32)' method, and this method cannot be translated into a store expression. 你能添加类别,项目模型类【参考方案2】:

您可以通过关注获得计数。

var results = Categories.Where(x=>x.Name.Equals("Beverages")
                    .Join(Items,
                    c=>c.CategoryID,
                    i=>i.CategoryID,
                    (c,i)=> i).Count();

对于模拟数据,

var Categories = new List<Category>

    new CategoryCategoryID =1, Name ="Beverages",
    new CategoryCategoryID =2, Name ="One",
    new CategoryCategoryID =3, Name ="Two"
;

var Items = new List<Item>

    new ItemItemID=3,CategoryID=4,ItemName="abc1",
    new ItemItemID=1,CategoryID=1,ItemName="abc2",
    new ItemItemID=1,CategoryID=1,ItemName="abc3",
    new ItemItemID=1,CategoryID=1,ItemName="abc4",
    new ItemItemID=1,CategoryID=1,ItemName="abc5",
    new ItemItemID=2,CategoryID=1,ItemName="abc6",
    new ItemItemID=3,CategoryID=4,ItemName="abc7",
    new ItemItemID=4,CategoryID=2,ItemName="abc8",
;

输出:5

更新

var results = dbContext.Categories.Where(x=>x.Name.Equals("Beverages")
                        .Join(dbContext.Items,
                        c=>c.CategoryID,
                        i=>i.CategoryID,
                        (c,i)=> i).Count();

【讨论】:

在 Visual Studio 中,您的查询对关键字 .Join 表示错误:The name 'Join' does not exist in the current context.' 您与 Join 一起使用的对象类型是什么?说如果它的类别。加入,类别的类型是什么?希望它是一个集合? 我相信您正在使用基于其他答案和 OP 中的一些 cmets 的 EF。我已经更新了答案。请检查 很抱歉,您的更新没有运行。 .Join 关键字也有同样的错误。 您能展示一下您尝试过的内容吗?特别是,您正在使用什么数据类型/集合

以上是关于使用 LINQ 根据外键值计算总数的主要内容,如果未能解决你的问题,请参考以下文章

使用动态唯一键值对linq / lambda表达式列表过滤数据

获取 RocksDB 中键值对的总数

在 Django 中使用 Q 查询外键值

从 Django values() 获取外键值

如何使用 PHP 插入或更新外键值

如何使用linq从字典中获取嵌套键值对[重复]