【发布时间】:2021-03-08 13:48:39
【问题描述】:
我有以下 SQL 查询,我需要将其转换为 LINQ。 SQL 查询:
select distinct a.DeliverableAdditionalFieldId, b.FieldName, b.CustomFieldType
from PrefixDeliverableAdditionalFieldsMapping as a, DeliverableAdditionalField as b
where a.DeliverableAdditionalFieldId = b.Id
and b.IsActive = 1
and a.PrefixId in (184,183)
我将 sql 查询转换为 LINQ,如下所示:
var prefixIds = "184, 183"
from prefix in context.PrefixDeliverableAdditionalFieldsMappings
join additionalField in context.DeliverableAdditionalFields on prefix.DeliverableAdditionalFieldId equals additionalField.Id
where additionalField.IsActive == true && prefixIds.Contains(prefix.PrefixId.ToString())
select new AdditionalCustomField
{
AdditionalFieldId = prefix.DeliverableAdditionalFieldId,
AdditionalFieldName = additionalField.FieldName,
FieldType = additionalField.CustomFieldType
}).Distinct().ToList()
对于 SQL 的 IN 运算符,在 LINQ 中我使用了代码:prefixIds.Contains(prefix.PrefixId.ToString()。现在我需要确定这没问题。请让我知道还有其他替代方法吗?
还有没有其他方法可以使用 distinct 和我使用的方式,它会起作用吗?
【问题讨论】:
-
我的 LINQ 很弱。我只是为了确保 LINQ 查询没有问题并且可以正常工作。
-
prefixIds是一个字符串,而不是一个集合,所以prefixIds.Contains(prefix.PrefixId.ToString())(假设它没有抛出异常)将被翻译成LIKE -
@mnu-nasir 对于初学者来说,LINQ 不是 SQL 的替代品,也不是编写嵌入式 SQL 的一种方式。它是一种用于在 ORM 之上工作的查询语言。从实体之间的关系生成 JOIN 是 ORM 的工作。使用 LINQ 逼近 SQL 比编写和执行 SQL 查询更难
-
看起来你的 SQL 也很弱。 Don't use
,cross join syntax,已弃用多年,请使用正确的join DeliverableAdditionalField daf on daf....。 Don't use meaningless aliases likeaandb。 Don't just stuff in aDISTINCTto filter out duplicates,想想是用嵌套的GROUP BY还是EXISTS -
这能回答你的问题吗? Linq version of SQL "IN" statement