如何使用 LINQ to SQL 在计算列上获得不同的值?

Posted

技术标签:

【中文标题】如何使用 LINQ to SQL 在计算列上获得不同的值?【英文标题】:How do I get distinct values on calculated columns using LINQ to SQL? 【发布时间】:2021-09-26 19:09:22 【问题描述】:

我正在使用实体框架 (C#) 执行 LINQ to SQL 查询,我只需要检索单个列的不同值。问题是,在执行不同的操作之前,我需要修剪其中的一些列。例如:

Region
--------------
Primary
Primary Region
Secondary 
Secondary Region
Primary Region

应该变成:

Region
-----------
Primary
Secondary

现在我正在通过以下查询实现这一点:

IQueryable<Region> regions =
(
    from region in db.Regions
    select new Region
    
        RegionName = detail.RegionName
    
).Distinct().OrderBy(r => r.RegionName);

return regions
    .ToArray()
    .Select(r => r.RegionName)
    .ToArray()
    .Distinct()
    .Select(r => new Region  RegionName = r )
    .ToArray();

public class Region

    private string _regionName;
    
    public string RegionName 
     
        get => _regionName;

        set => _regionName = value?.IndexOf(" Region") > 1 ? value?.Substring(0, value.IndexOf(" Region")) : value;
    

Region 类负责剥离名称。然而,这似乎非常低效,必须将所有转换为数组并返回到 Region 并返回到数组。有没有更好的办法?

【问题讨论】:

哇,所有的 ToArray 是怎么回事?为什么你认为有必要把它到处打? 请澄清。 LINQ to SQL 和实体框架是两种相互竞争的技术。我怀疑你在这里使用的是后者。此外,请说明您使用的是 EF Core 还是 EF for .Net Framework (4.x) 【参考方案1】:

我猜下面会从 linq 翻译成 sql:

var distinctRegions = db.Regions
      .Select(c => c.RegionName.Replace(" Region", "").Trim()) //Trim() (just in case) to remove any leading and trailing whitespaces.
      .Distinct()
      .OrderBy(c => c);

如果这可行,则意味着您需要将Region 类的RegionName 属性修改为简单的 get; set;

【讨论】:

这里似乎不需要修剪。 OP也有OrderBy;为了清楚起见,建议您包含它或声明您将其排除在外

以上是关于如何使用 LINQ to SQL 在计算列上获得不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL:多个列上的多个连接。这可能吗?

SQL 查询显示了良好的数据库值,但 LINQ to Entity 框架从无处获得空值

常用的SQL优化技巧

linq to sql、Entity Framework 和 NHibernate 的性能如何?

Linq to sql 按多条记录分组

如果不支持包含,您如何在 LINQ to Entities(实体框架)中执行 SQL 样式的“IN”语句?