【问题标题】:Query. Select from table where count of objects > n询问。从对象数 > n 的表中选择
【发布时间】:2018-05-14 15:40:23
【问题描述】:

我有带有字段 ModelName,Maker,Year,Price 的表格“Cars”和带有字段 的表格“Maker”名称。 我需要 Linq to Sql 查询,我可以在其中选择模型计数 > n 的所有制造商。

我试过了:

Data.ItemsSource = (from m in db.GetTable<Maker>()
                    where (from c in db.GetTable<Car>() 
                           where c.Maker == m.Name 
                           select c).Count() > 1
                    select m.Name);

但是没有结果。我该如何实现?

UPD。 表车代码

CREATE TABLE [dbo].[Car] (
    [CarId]     INT           IDENTITY (1, 1) NOT NULL,
    [ModelName] NVARCHAR (50) NOT NULL,
    [Equipment] NVARCHAR (50) NULL,
    [Year]      INT           NULL,
    [Price]     INT           NULL,
    [Cathegory] NCHAR (20)    DEFAULT ('Sedan') NOT NULL,
    [Maker]     NCHAR (20)    DEFAULT ('Toyota') NOT NULL,
    PRIMARY KEY CLUSTERED ([CarId] ASC),
    CONSTRAINT [FK_Car_ToCatheg] FOREIGN KEY ([Cathegory]) REFERENCES [dbo].[Catheg] ([Name]) ON DELETE CASCADE,
    CONSTRAINT [FK_Car_ToMaker] FOREIGN KEY ([Maker]) REFERENCES [dbo].[Maker] ([Name]) ON DELETE CASCADE
);

类车

 [Table(Name = "Car")]
    public class Car
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public int CarId { get; set; }
        [Column]
        public string ModelName { get; set; }
        [Column]
        public string Equipment { get; set; }
        [Column]
        public int Year { get; set; }
        [Column]
        public int Price { get; set; }
        [Column]
        public string Maker { get; set; }
        [Column]
        public string Cathegory { get; set; }

        public Car()
        { }
        public Car(string modelName, string equipment, int year, int price, string cath, string carmaker, int id = -1)
        {
            ModelName = modelName;
            Equipment = equipment;
            Year = year;
            Price = price;
            Maker = carmaker;
            Cathegory = cath;
            CarId = id;
        }

        public override string ToString()
        {
            return ModelName + " " + Equipment + " " + Year + " " + Maker + " " + Price + " " + Cathegory;

        }

制表器代码

CREATE TABLE [dbo].[Maker] (
    [Name] NCHAR (20) NOT NULL,
    PRIMARY KEY CLUSTERED ([Name] ASC)
);

类生成器

[Table(Name = "Maker")]
public class Maker
{
    [Column(IsPrimaryKey = true)]
    public string Name { get; set; }

}

【问题讨论】:

  • 似乎你想要c.MakerId == m.Id 或类似的东西,除非Maker 只是制造商的名字。此外,假设您在表之间具有外键关系,并且设置实体以正确利用它们,您应该能够使用导航属性。您可以分享相关实体的代码吗?另外你真的在使用 Linq-To-Sql 而不是 EF 吗?

标签: c# linq-to-sql


【解决方案1】:

这应该为您提供具有相应计数的制造商名称。

var Results = from c in db.GetTable<Car>() 
group c by c.Maker into cg
join m in db.GetTable<Maker>() on cg.FirstOrDefault().Maker equals m.Name
where cg.Count() > 1
select new 
{
    MakerName = m.Name,
    Count = cg.Count()
};

【讨论】:

  • cg.Key 应该与cg.FirstOrDefault().Maker 相同,但join 是多余的,因为您没有引用来自Maker 的任何其他字段。
【解决方案2】:

如果您实际上是指每个Maker.NameCars 的数量,您可以只在Car.Maker 上分组,并且不需要Maker 表:

Data.ItemsSource = from c in db.GetTable<Car>()
                   group c by c.Maker into cg
                   where cg.Count() > 1
                   select cg.Key;

如果模型实际上独立于YearPrice,那么您只需计算ModelNames:

var models = (from c in db.GetTable<Car>()
             select new { c.Maker, c.ModelName }).Distinct();

Data.ItemsSource = from c in models
                   group c by c.Maker into cg
                   where cg.Count() > 1
                   select cg.Key;

【讨论】:

  • 如何从 cg.Key 获取值?我想在 Datagrid 中显示结果,但它只显示空行
  • @FeoJun 我不确定我是否理解 - cg.Key 将是每个 c.Maker 所以它只是制造商名称,就像你的样本一样。
猜你喜欢
  • 2019-09-17
  • 2011-11-25
  • 2020-09-22
  • 2012-06-03
  • 2018-06-11
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多