实体框架3表连接一个右连接

时间:2016-03-09 12:18:21

标签: c# sql entity-framework-6

我有3张桌子:

strings
-----------
- string_id
- fallback_text

translations
----------------------
- translation_id
- string_id
- locale_id
- text

locales
---------------------
- locale_id

我想要实现这样的结果集:

string_id | locale_id | text
----------------------------
1         | en_US     | bread
1         | es_ES     | pan
1         | fr_FR     | NULL

没有翻译"面包"用法语,但我想在结果中。

在SQL中会有一些想法:

SELECT strings.string_id, locales.locale_id, translations.text
FROM strings
JOIN translations on strings.string_id = translations.string_id
RIGHT JOIN locales on translations.locale_id = locales.locale_id

此SELECT不能解决我的问题。我想要的是列出在locales表中存在的每个语言环境中没有翻译的每个字符串。我认为这不会发生在SELECT语句中。

想象一下,我们有: 语言环境表:

|locale_id|
-----------
|en_US    |
|es_ES    |

字符串表:

|string_id|fallback_text|
-------------------------
|1        |bread        |
|2        |water        |

翻译表:

|translation_id|string_id|locale_id|translation
-----------------------------------------------
|1             |1        |en_US    |bread
|2             |2        |es_ES    |agua

我想实现这个结果集:

string_id | locale_id | text
----------------------------
1         | en_US     | bread
1         | es_ES     | NULL
2         | en_US     | NULL
2         | es_ES     | agua

提前致谢。

2 个答案:

答案 0 :(得分:0)

实现此目的的最简单方法是使用SQL视图。

使用select语句创建SQL视图,然后创建一个与该视图匹配的实体。该实体将具有3个属性string_id,locale_id,text。确保此实体将(string_id和locale_id)定义为主键。如果您首先使用代码,那么您的映射将类似于:

ToTable("MyViewName");
HasKey(x => new { x.string_id, x.locale_id });

答案 1 :(得分:0)

var query = from s in db.strings
            from t in db.translation
            where s.string_id == t.string_id
            select new {s.stringid, t.locale_id, t.text }