如何使用lambda表达式或查询表达式创建此查询?

时间:2014-05-21 20:25:49

标签: entity-framework lambda

我有这张表:

  • TableA(IDTableA,...)
  • TableAC(IDTableA,IDTableC)
  • 表C(IDtableC ...)

我有TableA和TableC的实体,但不是TableB。在实体TableA中,我有一个集合ICOllection,在tableC中我有一个集合Icollection。

我想获得TableA中具有TableC寄存器的所有寄存器,其中TableC的ID = 5。

在T-SQL中应该是:

select * from TableA, TableAC, TableC
where TableA.IDTableA = TableAC.IDTableA
and TableC.IDTableC = TableAC.IDTableB
and TableA.IDTable = 5;

如何使用lambda表达式执行此查询?语法查询也是另一种选择。

感谢。

2 个答案:

答案 0 :(得分:2)

我认为实体框架在生成entites时省略了关系表AC,而是生成并填充ICollection属性。从本质上讲,它使得多对多关系不可见。要从TableA获取与TableC = 5有关系的所有实体,您可以直接对此ICollection进行LINQ查询:

from ta in TableA
where ta.TableC.Any(tc => tc.Id == 5)
select ta;

更新: 正如Tough Coder所说 - 在测试linq查询时,LINQPad确实是你的朋友。更不用说这是一个非常宝贵的代码暂存器(只需测试小样本而不需要启动一个全新的VS项目)。我刚刚制作了一个完整的示例来说明您需要的实体关系和linq查询:

void Main()
{
    List<TableA> ta = new List<TableA>();

    var ta1 = new TableA() { Id = 1 };
    var ta2 = new TableA() { Id = 2 };
    var ta3 = new TableA() { Id = 3 };

    ta.Add(ta1);
    ta.Add(ta2);
    ta.Add(ta3);

    var tc1 = new TableC() { Id = 1 };
    var tc2 = new TableC() { Id = 2 };
    var tc3 = new TableC() { Id = 3 };

    ta1.TableCs.Add(tc1);
    ta1.TableCs.Add(tc3);

    ta2.TableCs.Add(tc1);

    ta3.TableCs.Add(tc2);
    ta3.TableCs.Add(tc3);

    var res = from t in ta
              where t.TableCs.Any(tc => tc.Id == 3)
              select t.Id;

    foreach (var t in res)
    {
        Console.WriteLine(t);
    }
}

public class TableA
{
    public int Id {get;set;}
    public List<TableC> TableCs{get;set;}
    public TableA()
    {
        TableCs = new List<TableC>();
    }
}

public class TableC
{
    public int Id {get;set;}
    public List<TableA> TableAs{get;set;}
    public TableC()
    {
        TableAs = new List<TableA>();
    }
}

答案 1 :(得分:1)

很长一段时间你可以这样做:

from c in db.TableA
where c.TableC.Any(tc => tc.Id == 5)
select c;

如果要在SQL中检查此代码,可以使用LINQPad。它将在SQL中显示此Linq查询。

对于另一种解决方案,您可以使用ExecuteStoreQuery发送SQL查询。如:

db.ExecuteStoreQuery<Results_Class>("select * from TableA, TableAC, TableC
where TableA.IDTableA = TableAC.IDTableA
and TableC.IDTableC = TableAC.IDTableB
and TableA.IDTable = 5;");

对于此解决方案,您必须创建一个Results_Class类。