2014-03-27 32 views
0

这可能是非常基本的,但我们现在就去,因为现在我无法解决这个问题。如何使用EF选择使用DISTINCT和FOREIGN KEY在一起

I'm使用实体Frameword用于Oracle(管理驱动程序),并希望做让所有以下:

我有2个数据库表如下:

TABLE_USER 

    ID INTEGER 
    NAME STRING 
    AGE INTEGER 

Content: 

    0 JOHN 39 
    1 MARY 40 
    2 ALBERT 41 
    3 ROBERT 42 
    4 SARAH 43 
    5 PETER 44 



    TABLE_EVENTS 

    ID   INTEGER 
    EVENT_NAME STRING 
    USER_ID INTEGER (FOREIGN KEY TO TABLE_USER.ID) 

Content: 

    0 CREATE 1 
    1 CREATE 2 
    2 CREATE 5 
    3 DELETE 3 
    4 DELETE 0 
    5 CREATE 1 
    6 DELETE 3 
    7 CREATE 0 
    8 UPDATE 4 
    9 UPDATE 5 
    10 DELETE 1 

我需要得到所有DISTINCT其中TABLE_USER中的用户年龄具有特定条件(如AGE <= 40)的TABLE_EVENTS的值。

这个例子可以给我下面的列表: CREATE DELETE

我的代码应该是这样的:

IQueryable<TABLE_USER> tableUser = dbContext.TABLE_USER; 
    IQueryable<TABLE_EVENTS> tableEvents = dbContext.TABLE_EVENTS; 

    /// 
    /// Build the query 
    /// 
    tableUserQuery = tableUser.Where(record => record => USER_ID == ??tableUser.ID?? && 
            ??tableUser.AGE < 30??).GroupJoin(???); 
    /// 
    /// Execute que query 
    /// 
    var dbList = query.ToList(); 

我一直在寻找群组加入和其他的东西,但我不能,甚至人物如何建立此查询,因此,所有从来就贴在骨架...

感谢任何形式的帮助。

回答

1

通常在2代表的外键连接,EF生成导航性能达到其他实体,您可以使用此查询。

List<string> events = dbContext.TABLE_EVENTS.Where(te=>te.TABLE_USER.AGE < 30).Select(te=>te.EVENT_NAME).Distinct().ToList(); 

如果您没有看到挂外国实体,则该查询

List<string> events = dbContext.TABLE_EVENTS.Join(dbContext.TABLE_USERS, te=>te.USER_ID, tu=>tu.ID, (te,tu)=> te).Where(te=>te.TABLE_USER.AGE < 30).Select(te=>te.EVENT_NAME).Distinct().ToList(); 

上面的查询基本上没有内部连接的用户ID,应用过滤器并得到不同的值。

+0

出现了外部实体链接,但是我收到以下编译器错误:无法将类型'System.Linq.IQueryable '转换为'System.Linq.IQueryable '。一个显式转换存在(是否缺少强制转换?)......这表明,错误与这两个语句.... – Mendes

+0

那是因为你不需要的IQueryable 了..结果是一个IQueryable 或列表基于如果你做了一个ToList()或者不是,则相应地更新答案。希望有所帮助。 –

+0

工作正常。感谢帮助。 – Mendes