首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用查询链接三个表并返回所有数据?

如何使用查询链接三个表并返回所有数据?
EN

Stack Overflow用户
提问于 2015-11-22 03:17:54
回答 2查看 373关注 0票数 1

我在看this,但我的问题有点不同。我正在构建一个简化的搜索引擎,允许用户根据标签找到汽车。我使用的是WebApi,它返回JSON数据,但是我只能知道如何返回我想要的一些数据。在搜索引擎中,我想列出所有过滤过的汽车,但也包括它们的所有相关标签。当前代码只返回汽车,而不返回标签。希望能得到一些帮助。

想要的产出:

代码语言:javascript
运行
复制
Audi
fast, groovy, slick

BMW
fast, classic

...

来自Server和C#强类型类(实体框架)的以下表如下所示:

代码语言:javascript
运行
复制
//    Cars { Id, Name }
//    Tags { Id, Title }
//    CarTags { TagId, CarId }

Cars[] Cars = new Cars[]
{
    new Cars(1, "Audi"),
    new Cars(2, "BMW"),
    new Cars(3, "Chrysler"),
    new Cars(4, "Ford"),
};

Tags[] Tags = new Tags[]
{
    new Tags(1, "fast"),
    new Tags(2, "groovy"),
    new Tags(3, "slick"),
    new Tags(4, "classic"),
};

CarTags[] CarTags = new CarTags[]
{
    new CarTags(1,1),
    new CarTags(2,1),
    new CarTags(3,1),
    new CarTags(1,2),
    new CarTags(4,2)
};

SQL查询可以如下所示:

代码语言:javascript
运行
复制
SELECT * FROM Cars c
INNER JOIN
    CarTags ct on c.Id = ct.CarId
INNER JOIN 
    Tags t on ct.TagId = t.Id
WHERE 
    t.Title = 'fast'

..。当然,它会返回所有与“快速”标签相关的汽车。

对于LINQ,我正在做这样的事情:

代码语言:javascript
运行
复制
var q = from c in Cars
        join ct in CarTags on c.Id equals ct.CarId
        join t in Tags on ct.TagId equals t.Id
        where t.Title == "fast"
        select c;

// return data from WebApi 
var page = curPage; // curPage fetched via parameter
var take = 6;
var skip = (page - 1) * take;
return new PagedList<Cars>
{
    Filtered = q.Count(),
    Model = q.Skip(skip).Take(take).ToList()
};

PagedList是这样的:

代码语言:javascript
运行
复制
public class PagedList<T>
{
    public int Filtered { get; set; }
    public IEnumerable<T> Model { get; set; }
}

当我在接收端循环这些数据时,我使用类似的东西,但我只能枚举汽车,而不能列举标签。

代码语言:javascript
运行
复制
foreach (var item in q) // item = car object
{
    Console.WriteLine("\n\n" + car.Name);
    //foreach (var tag in item) // can't enumerate all associated tags here
    //{
    //    Console.Write(tag.Title + ", ");
    //}
}

我被困在林克了。如何在Linq中实现这种功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-22 03:31:19

在CarTag类中,可以创建两个新属性。一个是汽车,一个是标签。这些是其他表的外键,也是该对象的外键。例如,您的类应该是这样的。

代码语言:javascript
运行
复制
public class CarTag
{
    public int CarId {get;set;}
    public int TagId {get;set;}

    [ForeignKey("CarId")]
    public virtual Car Cars {get;set;}

    [ForeignKey("TagId")]
    public virtual Tag Tags {get;set;}
}

那么您的查询就会是这样的。

代码语言:javascript
运行
复制
var q = from c in Cars
    join ct in CarTags on c.Id equals ct.CarId
    join t in Tags on ct.TagId equals t.Id
    where t.Title == "fast"
    select ct;

这将懒惰地为您加载汽车和标签,因为它们有外部引用。

票数 0
EN

Stack Overflow用户

发布于 2015-11-22 03:25:25

这是您的select c行,您要告诉linq只返回cars类。要获得所有这些信息,您可以创建一个新的对象,例如CarsAndTags,其中包含两个属性。然后,您将更新select语句如下。

代码语言:javascript
运行
复制
select new CarsAndTags{Name= c.name,tag=ct.tag}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33851248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档