Linq查询投影Id不是名字

时间:2016-05-06 15:28:52

标签: c# linq

我的设置很简单。

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编写的,生产代码需要更多调整。

1 个答案:

答案 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);