【问题标题】:Use IN operator and get distinct values in LINQ C#使用 IN 运算符并在 LINQ C# 中获取不同的值
【发布时间】: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 like a and bDon't just stuff in a DISTINCT to filter out duplicates,想想是用嵌套的GROUP BY还是EXISTS
  • 这能回答你的问题吗? Linq version of SQL "IN" statement

标签: c# linq


【解决方案1】:

您现在正在对字符串执行.Contains(),例如还会找到“1”,我很确定您不希望这种情况发生。

相反,将prefixIds 定义为所需类型的集合,例如int[]:

var prefixIds = new[] { 184, 183 };

然后你可以如下使用它:

where ..... && prefixIds.Contains(prefix.PrefixId)

这转换为 SQL IN (...) 子句。

【讨论】:

  • 如果对字符串应用 Contains,请使用 toUpper/Lower 或 .Contains(myStringToCheck, StringComparison.OrdinalIgnoreCase)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多