C# 具有多个表的Linq查询

C# 具有多个表的Linq查询,c#,linq,asp.net-mvc-4,C#,Linq,Asp.net Mvc 4,尝试键入将包含两个表中信息的Linq表达式 var articles = db.Articles; var articlescores = db.ArticleScores; articles表具有标题字段 articles.title articlescores表具有Actuality字段和ArticleID字段 articlescores.ActualCity artickescores.ArticleID (which links to articles

尝试键入将包含两个表中信息的Linq表达式

        var articles = db.Articles;
        var articlescores = db.ArticleScores;
articles表具有标题字段

articles.title
articlescores表具有Actuality字段和ArticleID字段

articlescores.ActualCity
artickescores.ArticleID (which links to articles table)
我需要
.Count()
查看
articlescores.actuality
字段,然后将计数最高的城市与
articles.title一起存储在字符串中

基本上,一个城市浏览的文章最多

样本数据:

ArticleScore表:

    ID articleID City  (Note: articleID is not dependent on City, I just wrote it this way)
    1    1       New York   
    2    2       Boston
    3    1       New York
    4    1       New York
    5    1       New York
    6    2       Boston
条款表:

ID title
1  TitleOneOfArticles
2  TitleTwoOfArticles
预期产出(因为纽约有4个,波士顿只有2个):

只需要一行输出。

试试这个linq:

db.Articles
               .Join(db.ArticleScores ,
                   art=> art.ID,
                   scr=> scr.ID,
                   (art, scr) => new { article= art, score= scr})
                   .Where(both => (both.art.ID == cityID))
                   .Select(both => both.score)

cityId是您应该发送的参数

您的问题是自相矛盾的,而且它还缺少一些关键信息。所以我要猜一猜

  • 你没有提到你正在使用的linq。您正在使用实体框架吗?光速?还有别的吗?我假设它是实体框架
  • 你说你基本上需要一个城市浏览最多的文章,但接着你给出了一些不同的例子。我想这是《城市》杂志上浏览量最大的一篇文章
  • 您说articleID不依赖于城市,但接下来给出了一个城市和articleID之间一对一关系的示例
以下是我如何理解ArticleScore示例数据集:

    ID articleID  City  
     ?    1       New York   
     ?    1       New York
     ?    1       New York
     ?    1       Boston
     ?    2       New York
     ?    2       Boston
     ?    2       Boston
在该数据集中,纽约的第1条有3个视图,第2条有1个视图。同样,在波士顿,第2条有两种观点,第1条有一种观点

根据这些数据,我假设你想得到这样的东西

TitleTwoOfArticles, Boston(2)
TitleOneOfArticles, NewYork(3)
上表表明,波士顿最受欢迎的文章是第2条,共有2篇。在纽约,浏览量最大的文章是1篇,总共有3篇。请注意,此处未显示一篇文章在所有城市的浏览总数

A创建了一个代码示例来测试上述场景,我使用了:

  • Visual Studio 2013/.net 4.5
  • 实体框架6
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;

namespace SO22928136
{
    public interface IMyDbContext : IDisposable
    {
        IDbSet<Article> Articles { get; set; }
        IDbSet<ArticleScore> ArticleScores { get; set; }
        int SaveChanges();
    }

    public class MyDbContext : DbContext, IMyDbContext
    {
        public IDbSet<Article> Articles { get; set; }
        public IDbSet<ArticleScore> ArticleScores { get; set; }

        static MyDbContext()
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        }

        public MyDbContext(string connectionString) : base(connectionString)
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.Add(new ArticleConfiguration());
            modelBuilder.Configurations.Add(new ArticleScoreConfiguration());
        }
    }

    public class Article
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public virtual ICollection<ArticleScore> ArticleScores { get; set; }
        public Article()
        {
            ArticleScores = new List<ArticleScore>();
        }
    }

    public class ArticleScore
    {
        public int Id { get; set; }
        public int ArticleId { get; set; }
        public string ActualCity { get; set; }
        public virtual Article Article { get; set; }
    }

    internal class ArticleConfiguration : EntityTypeConfiguration<Article>
    {
        public ArticleConfiguration()
        {
            ToTable("Article");
            HasKey(x => x.Id);
            Property(x => x.Id).HasColumnName("Id").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(x => x.Title).HasColumnName("Title").IsOptional();
        }
    }

    internal class ArticleScoreConfiguration : EntityTypeConfiguration<ArticleScore>
    {
        public ArticleScoreConfiguration()
        {
            ToTable("ArticleScore");
            HasKey(x => x.Id);
            Property(x => x.Id).HasColumnName("Id").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(x => x.ArticleId).HasColumnName("ArticleId").IsRequired();
            Property(x => x.ActualCity).HasColumnName("ActualCity").IsOptional().HasMaxLength(10);
            HasRequired(a => a.Article).WithMany(b => b.ArticleScores).HasForeignKey(c => c.ArticleId);
        }
    }


    class Program
    {
        static void Main()
        {
            MyDbContext context = new MyDbContext("Data Source=(local);Initial Catalog=SO22928136;Integrated Security=True;");
            CreateTestData(context);

            var countOfArticlesPerCity = context.ArticleScores.GroupBy(s => new {s.ArticleId, s.ActualCity}).Select(g => new {g.Key.ArticleId, g.Key.ActualCity, Count = g.Count()});
            var highestArticleCountPerCity = countOfArticlesPerCity.GroupBy(x => x.ActualCity).Select(g => g.OrderByDescending(x => x.Count).FirstOrDefault());
            var highestArticleCountPerCityWithArticleTitle = context.Articles.Join(highestArticleCountPerCity, x => x.Id, p => p.ArticleId, (x, p) => new { x.Title, p.ActualCity, p.Count });

            foreach (var line in highestArticleCountPerCityWithArticleTitle)
            {
                Console.WriteLine("{0}, {1}({2})",line.Title,line.ActualCity, line.Count);
            }

        }

        private static void CreateTestData(MyDbContext context)
        {
            Article articleOne = new Article { Title = "TitleOneOfArticles" };
            Article articleTwo = new Article { Title = "TitleTwoOfArticles" };

            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "Boston" });

            articleTwo.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleTwo.ArticleScores.Add(new ArticleScore { ActualCity = "Boston" });
            articleTwo.ArticleScores.Add(new ArticleScore { ActualCity = "Boston" });

            context.Articles.Add(articleOne);
            context.Articles.Add(articleTwo);
            context.SaveChanges();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Data.Entity;
使用System.Data.Entity.ModelConfiguration;
名称空间SO22928136
{
公共接口IMyDbContext:IDisposable
{
IDbSet项目{get;set;}
IDbSet属性{get;set;}
int SaveChanges();
}
公共类MyDbContext:DbContext,IMyDbContext
{
公共IDbSet项目{get;set;}
公共IDbSet属性{get;set;}
静态MyDbContext()
{
SetInitializer(新的DropCreateDatabaseAlways());
}
公共MyDbContext(string connectionString):基本(connectionString)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Configurations.Add(newarticleconfiguration());
添加(新的ArticleScoreConfiguration());
}
}
公共类文章
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection{get;set;}
公共物品()
{
ArticleScores=新列表();
}
}
公开课文章分数
{
公共int Id{get;set;}
公共int ArticleId{get;set;}
公共字符串实际值{get;set;}
公共虚拟项目{get;set;}
}
内部类ArticleConfiguration:EntityTypeConfiguration
{
公共配置()
{
可折叠(“物品”);
HasKey(x=>x.Id);
属性(x=>x.Id).HasColumnName(“Id”).IsRequired().hasDatabaseGenerateOption(DatabaseGenerateOption.Identity);
属性(x=>x.Title).HasColumnName(“Title”).IsOptional();
}
}
内部类ArticleScoreConfiguration:EntityTypeConfiguration
{
公共配置()
{
ToTable(“ArticleScore”);
HasKey(x=>x.Id);
属性(x=>x.Id).HasColumnName(“Id”).IsRequired().hasDatabaseGenerateOption(DatabaseGenerateOption.Identity);
属性(x=>x.ArticleId).HasColumnName(“ArticleId”).IsRequired();
属性(x=>x.ActualCity).HasColumnName(“ActualCity”).IsOptional().HasMaxLength(10);
HasRequired(a=>a.Article)。有许多(b=>b.Article分数)。HasForeignKey(c=>c.ArticleId);
}
}
班级计划
{
静态void Main()
{
MyDbContext上下文=新的MyDbContext(“数据源=(本地);初始目录=SO22928136;集成安全性=True;”);
CreateTestData(上下文);
var countOfArticlesPerCity=context.ArticleScores.GroupBy(s=>new{s.ArticleId,s.ActualCity})。选择(g=>new{g.Key.ArticleId,g.Key.ActualCity,Count=g.Count();
var highestarticlecontpercity=countOfArticlesPerCity.GroupBy(x=>x.ActualCity)。选择(g=>g.OrderByDescending(x=>x.Count)。FirstOrDefault();
var highestArticleCountPerCityWithArticleTitle=context.Articles.Join(highestArticleCountPerCity,x=>x.Id,p=>p.ArticleId,(x,p)=>new{x.Title,p.ActualCity,p.Count});
foreach(highestArticleCountPerCityWithArticleTitle中的var行)
{
WriteLine(“{0},{1}({2})”,line.Title,line.ActualCity,line.Count);
}
}
私有静态void CreateTestData(MyDbContext上下文)
{
第1条=新的第{Title=“TitleOneOfArticles”};
第2条=新的第{Title=“TitleTwoOfArticles”};
articleOne.ArticleScores.Add(新ArticleScores{ActualCity=“NewYork”});
文章
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;

namespace SO22928136
{
    public interface IMyDbContext : IDisposable
    {
        IDbSet<Article> Articles { get; set; }
        IDbSet<ArticleScore> ArticleScores { get; set; }
        int SaveChanges();
    }

    public class MyDbContext : DbContext, IMyDbContext
    {
        public IDbSet<Article> Articles { get; set; }
        public IDbSet<ArticleScore> ArticleScores { get; set; }

        static MyDbContext()
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        }

        public MyDbContext(string connectionString) : base(connectionString)
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.Add(new ArticleConfiguration());
            modelBuilder.Configurations.Add(new ArticleScoreConfiguration());
        }
    }

    public class Article
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public virtual ICollection<ArticleScore> ArticleScores { get; set; }
        public Article()
        {
            ArticleScores = new List<ArticleScore>();
        }
    }

    public class ArticleScore
    {
        public int Id { get; set; }
        public int ArticleId { get; set; }
        public string ActualCity { get; set; }
        public virtual Article Article { get; set; }
    }

    internal class ArticleConfiguration : EntityTypeConfiguration<Article>
    {
        public ArticleConfiguration()
        {
            ToTable("Article");
            HasKey(x => x.Id);
            Property(x => x.Id).HasColumnName("Id").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(x => x.Title).HasColumnName("Title").IsOptional();
        }
    }

    internal class ArticleScoreConfiguration : EntityTypeConfiguration<ArticleScore>
    {
        public ArticleScoreConfiguration()
        {
            ToTable("ArticleScore");
            HasKey(x => x.Id);
            Property(x => x.Id).HasColumnName("Id").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(x => x.ArticleId).HasColumnName("ArticleId").IsRequired();
            Property(x => x.ActualCity).HasColumnName("ActualCity").IsOptional().HasMaxLength(10);
            HasRequired(a => a.Article).WithMany(b => b.ArticleScores).HasForeignKey(c => c.ArticleId);
        }
    }


    class Program
    {
        static void Main()
        {
            MyDbContext context = new MyDbContext("Data Source=(local);Initial Catalog=SO22928136;Integrated Security=True;");
            CreateTestData(context);

            var countOfArticlesPerCity = context.ArticleScores.GroupBy(s => new {s.ArticleId, s.ActualCity}).Select(g => new {g.Key.ArticleId, g.Key.ActualCity, Count = g.Count()});
            var highestArticleCountPerCity = countOfArticlesPerCity.GroupBy(x => x.ActualCity).Select(g => g.OrderByDescending(x => x.Count).FirstOrDefault());
            var highestArticleCountPerCityWithArticleTitle = context.Articles.Join(highestArticleCountPerCity, x => x.Id, p => p.ArticleId, (x, p) => new { x.Title, p.ActualCity, p.Count });

            foreach (var line in highestArticleCountPerCityWithArticleTitle)
            {
                Console.WriteLine("{0}, {1}({2})",line.Title,line.ActualCity, line.Count);
            }

        }

        private static void CreateTestData(MyDbContext context)
        {
            Article articleOne = new Article { Title = "TitleOneOfArticles" };
            Article articleTwo = new Article { Title = "TitleTwoOfArticles" };

            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleOne.ArticleScores.Add(new ArticleScore { ActualCity = "Boston" });

            articleTwo.ArticleScores.Add(new ArticleScore { ActualCity = "NewYork" });
            articleTwo.ArticleScores.Add(new ArticleScore { ActualCity = "Boston" });
            articleTwo.ArticleScores.Add(new ArticleScore { ActualCity = "Boston" });

            context.Articles.Add(articleOne);
            context.Articles.Add(articleTwo);
            context.SaveChanges();
        }
    }
}