代码之家  ›  专栏  ›  技术社区  ›  Jean-Francois

MVC 2,实体框架4。自定义泛型查询。我把密码放哪儿了?

  •  0
  • Jean-Francois  · 技术社区  · 14 年前

    这是我的问题,我有一个多语言数据库shema。首先我想要一个有这个结果的查询
    法语|英语
    汽车|空
    Etoile |星星
    空猴
    ...

    我很确定我将需要使用左连接与透视表相结合。


    数据库中有很多multilang表。如何进行一般查询

    语言文字
    兰吉德峰
    朗格曼·恩瓦查(100)

    类别
    CatID主键
    无效位

    类别文本

    猫名nvarchar(200)
    兰吉德国际

    2 回复  |  直到 14 年前
        1
  •  0
  •   Community paulsm4    7 年前

    你好像在问几个问题。首先,当您询问将查询放在何处时,这实际上取决于您所遵循的设计。在很多情况下,存储库模式似乎是数据访问的合理想法,但我不知道它在您的情况下是否合适。例如,您已经在其他地方使用存储库了吗?

    如果在林,请看看这个问题的答案。它们可能适用于: Pivot data using LINQ

    如果是在SQL中,并且假设您使用的是sqlserver,那么您确实可以使用groupby或pivot操作符(如果您运行的是最新版本)来执行pivot。但是,这两种情况都不支持动态数量的语言—必须显式声明每个语言的请求列。像这样:

    --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操作符不支持动态语句,比如扩展参数中的子查询(英语,法语),所以我不知道如何处理泛型。希望这至少能澄清你的方向。

        2
  •  0
  •   JanW    14 年前

    产生结果的简单查询(假设LangID1=法语,LangID2=英语):

    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
    

    在哪种情况下你需要多语言能力?如果您在运行时只需要两种语言,我建议您查询这两种语言并构建一个Tuple(新的Tuple类随.NET4.0提供),其中第一个泛型参数是lang id,其他参数是特定语言。您可以在CategoryName实体上构建一个分部类,该实体包含一个函数,该函数为您提供那些字典/元组。您可以很容易地将上面的查询转换成LINQ。