我对使用 LINQ 非常陌生并且已经做了一些事情,现在我有一个需要在 LINQ 中实现的 SQL 查询,但我不知道该怎么做。
SELECT Boletas.Boleta, DATEPART(DW, CAST(Boletas.Fecha AS datetime)) AS DiaDeLaSemana,
Materiales.Descripcion, Clientes.Nombre,
induscomer.NoCliente AS induscomerNoCliente
FROM Boletas
INNER JOIN Materiales
ON Boletas.Material = Materiales.Material AND Boletas.Familia = Materiales.Familia
INNER JOIN Clientes
ON Boletas.NoCliente = Clientes.NoCliente
LEFT OUTER JOIN induscomer
ON Clientes.NoCliente = induscomer.NoCliente
WHERE (Boletas.Fecha >= '20170101') AND (Boletas.Fecha <= '20170107')
AND (Boletas.Status = 'A')
ORDER BY Boletas.Material
这样,如果induscomer表中不存在相应的客户端,则induscomerNoCliente将为空。
我尝试遵循一些我发现这样做的帮助:
var boletaQuery = (
from b in _context.Boletas
join m in _context.Materiales on b.Material equals m.Material
join c in _context.Clientes on b.NoCliente equals c.NoCliente
join i in _context.induscomer on c.NoCliente equals i.NoCliente into indus
from ind in indus.DefaultIfEmpty()
where b.Fecha.CompareTo(FechaIni) >= 0
&& b.Fecha.CompareTo(FechaFin) <= 0
&& b.Status.Equals('A')
select new {
b,
induscomerNoCliente = ind.NoCliente,
NombreCliente = c.Nombre,
DescripcionMaterial = m.Descripcion
}
);
但是当我这样做时boletaQuery.ToList();
,我收到以下错误:
System.Data.Entity.dll 中未处理的“System.NotSupportedException”类型异常附加信息:无法创建“System.Object”类型的常量值。此上下文仅支持原始类型或枚举类型。
有一个工具可以帮助你,它叫做Linqer. 此工具可以帮助您将SQL查询转换为 Linq,反之亦然。
我建议您使用它,查看它在执行转换时的行为,最重要的是,将其同化为非常相似,尽管乍一看似乎 SQL 和 Linq 完全不同,但不要那样看。
同样,我建议您查看官方文档(英文)并了解如何开始使用 Linq。
好吧,非常感谢大家的贡献,遵循@YanetSilvaFernández、@WeimarYamitMorenoPerez、@Flxtr 的建议,经过大量测试,LEFT OUTER JOIN 现在是:
然后我将数据加载到我将 induscomerNoCliente 字段定义为 int 的结构中?(允许空值)具有以下循环:
再次问候和感谢
这对我有用:
…………………………………………………………………………………………………………………………
.........................这是 sql 中两个查询的执行计划,它们的成本相同。(隐式连接和显式连接有什么区别?)
你的问题很有趣,但除了找出如何转换它之外,我建议你试试这个软件:
LINQPad
它是一个非常有用的工具,它可以用来测试 DB 连接上的直接 linq 代码:
这个其他程序执行将 SQL 转换为 linq 所需的操作:
sqltolinq
显然两者都是有偿的:(