【问题标题】:converting a t-sql query to Linq to Sql with coalesce and multiple join使用合并和多重连接将 t-sql 查询转换为 Linq to Sql
【发布时间】:2011-01-09 18:29:53
【问题描述】:

我们有两个相关的表(inventory、inventoryLocalization)和一个 t-sql 查询对它们进行如下处理..

select inv.[code],
       coalesce(inL.name, inL2.name) as [name],
       coalesce(inL.description, inL2.description) as [description]
from dbo.[inventory] inv
left join dbo.[inventoryLocalization] inL on inv.code  = inL.code and inL.language = 'de'
left join dbo.[inventoryLocalization] inL2 on inv.code  = inL2.code and inL2.language = 'en'
where inv.[code] like '15.' + '%'
order by inv.[code];

为了提高性能,我们将尝试使用缓存中的这些表,而不是直接从 RDBMS 中使用。 对于 asp.net 4.0 项目,由 c# 编写。 我们已经使用 DataSet 将两个表都用于 chache,并且我们可以通过该 DataSet 访问它们。

DataSet ds = UtilityCache.getCachedDataSet();

“ds.Tables[0]”是inventory表,“ds.Tables[1]”是inventoryLocalization

但是我们如何将上面的 T-Sql 语法转换为 linq2Sql。 是否可以对 select 语句使用 coalesce 并在具有多个条件的两个表上连接?

提前谢谢..

【问题讨论】:

    标签: c# asp.net linq linq-to-sql c#-4.0


    【解决方案1】:

    可以使用 c# ?? 合并运算符简单地完成合并,即

    select x.Name ?? y.Name;
    

    联接是 LINQ 中的单一条件,但在大多数情况下(至少对于内部联接),您可以为相同的结果添加额外的“位置”。不幸的是,外部连接更难:(

    另外请记住,当翻译变得不理想或只是令人困惑时,您可以使用:

    var data = ctx.ExecuteQuery<ResultType>(tsql, args).ToList();
    

    使用{0} 等表示参数(如string.Format 说明符),其中 ResultType 可以是属性名称与返回的列名称匹配的任何类型(为此我经常使用特定于查询的本地类型)。

    【讨论】:

      猜你喜欢
      • 2016-05-27
      • 2010-12-02
      • 2017-10-06
      • 2020-08-28
      • 2017-03-04
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多