关于 asp.net mvc:MVC 2, Entity Framework 4. 自定义通用查询。我把代码放在哪里?

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,例如

一月