C# 具有多个表的Linq查询
尝试键入将包含两个表中信息的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
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();
}
}
}