MVC 2, Entity Framework 4. Custom Generic Query. Where I put the code?
这是我的问题,我有一个多语言数据库 shema。首先我想要一个带有这个结果的查询
法语 |英语
汽车 |空值
星辰 |星星
空 |猴
...
我很确定我需要将左连接与数据透视表结合使用。
我想把这个查询放在哪里。在 Partial 类中,或者我需要使用存储库模式来保存查询。
我在数据库中有很多多语言表。如何进行通用查询
语言
语言识别PK
语言名称 nvarchar(100)
类别
CatID PK
IsActive 位
类别文本
CatID FK
猫名 nvarchar(200)
LangID 整数
您似乎在这里问了几个问题。首先,当您询问将查询放在哪里时,这实际上取决于您所遵循的设计。在很多情况下,存储库模式似乎是数据访问的一个合理想法,但我不知道它是否适合您的情况。例如,您是否已经在其他地方使用存储库?
其次,您是在寻找 SQL 中还是通过 LINQ 的有效"通用"查询(即适用于多种语言的查询)?
如果在 LINQ 中,请查看此问题的答案。它们可能适用:使用 LINQ
透视数据
如果在 SQL 中,并且假设您使用的是 SQL Server,您确实可以使用 GROUP BY 或者,如果您正在运行最新版本,则使用 PIVOT 运算符执行数据透视。但是,这两种情况都不支持动态数量的语言 - 必须明确声明每种语言的请求列。像这样:
1 2 3 4 5 6 7 8 9 10 11 12 | --GROUP BY SELECT ct.CatID, MAX(CASE WHEN l.LangName = 'English' THEN ct.CatName END) AS English, MAX(CASE WHEN l.LangName = 'French' THEN ct.CatName END) AS French FROM CategoryText ct INNER JOIN Languages l ON l.LangID = ct.LangID GROUP BY ct.CatID; --PIVOT SELECT ct.CatID, English, French FROM CategoryText ct INNER JOIN Languages l ON l.LangID = ct.LangID PIVOT(MAX(ct.CatName) FOR l.LangName IN([English], [French])) AS P; |
由于 Pivot 运算符不支持动态语句,例如扩展参数 (IN(English, French)) 中的子查询,我不确定如何处理通用情况。希望这至少可以阐明您的方向。
产生结果的简单查询(假设 LangID1 = 法语,LangID2 = 英语):
1 2 3 4 | SELECT ct1.CatName as french, ct2.CatName as english FROM CategoryText ct1, CategoryText ct2 WHERE ct1.LangID = 1 AND ct2.LangID = 2 AND ct1.CatID = ct2.CatID |
你在什么场景下需要多语言能力?如果您在运行时只需要 2 种语言,我建议您查询这两种语言并构建一个 Tuple(新的 Tuple 类随 .NET 4.0 一起提供)其中第一个通用参数是 lang id 和其他特定语言的元组。您可以在 CategoryName 实体上构建一个部分类,该实体包含一个函数,该函数为您提供那些 dictionary/tuple 。您可以轻松地将上述查询转换为 LINQ,例如
一月