我的设置很简单。
FRUIT Table
Id Name
1 Gala Apples
2 Navel Oranges
3 Peach
4 Mandarin Oranges
5 Kiwi
6 Fuji Apples
INTERSECT TABLE
FruitId CrossRefFruitId
1 6
2 4
因此,如果用户正在观看Gala Apples(1),他们也可能对Fuji Apples(6)感兴趣。
我有一个返回Fruit的简单模型
Model
public class FruitCategory
{
public int Id { get; set; }
public string FruitName { get; set; }
}
EF:
public IEnumerable<FruitCategory> GetFruitbyId(int id)
{
return _context.FruitTable.Where(q => q.FruitId == id);
}
这很好但现在我也想添加“SeeAlso”水果。所以我在模型中创建了一个crossref模态和一个新字段。
CrossReff Model
public class FruitCrossRef
{
public int Id { get; set; }
public string CrossRefName { get; set; }
}
Model
public class FruitCategory
{
public int Id { get; set; }
public string FruitName { get; set; }
public List<FruitCrossRef> SeeAlsoFruits {get; set;}
}
现在我遇到了困难......如何获得将填充此模型的LINQ投影。
由于我不知道如何写这个,我打开LINQPAD并开始黑客攻击和谷歌搜索。
到目前为止,这是我提出的,但它在交叉表中返回 MATCHING id,但我想要的是在Fruit Table中返回CrossReferenced ID和FruitName。
var seeAlso =
(from frt in FruitTable
where frt.Id == 1
select frt.Id)
.Intersect
(from frtCross in IntersectTable
select frtCross.FruitId);
seeAlso.Dump();
现在我可以看到一条路径,我可以通过制作几个循环获取seealso引用来完成工作,然后每个循环返回到Fruit表并获取该记录......但是它似乎应该是利用关系的力量和投射我完全填充的模型的方式???
代码更正
对于其他可能遇到此问题的人来说,答案中有一些语法错误,但答案仍然是我想要的。
var seeAlso =
(from frt in FruitTable
join intsec in IntersectionTable
on frt.Id equals intsec.CrossRefFruitId
where intsec.FruitId == 1
select frt);
seeAlso.Dump();
请记住,这是为Linq Pad编写的,生产代码需要更多调整。
答案 0 :(得分:2)
你最终想要的是FruitItems
的列表,基于其他一些水果也是感兴趣的,因为水果ID。因此,您应该选择与该Id连接到Intersection表的Fruits,而不是选择与您想要的Id对应的Fruit。例如。
var seeAlso =
(from frt in FruitTable
join intsec in IntersectionTable
on frt.Id = intsec.CrossRefFruitId
where intsec.FruitId == 1);