【问题标题】:Return unique values only in Webapi controller仅在 Webapi 控制器中返回唯一值
【发布时间】:2016-03-16 13:50:37
【问题描述】:

我在 WebApi 控制器中有以下行;

string Codes = i.Products.FirstOrDefault().Code

正如该行所述,它从第一个产品中获取代码。

但是,我真正想做的是获取所有唯一代码,并将它们作为逗号分隔的字符串返回。

假设有 6 个相关产品,它们的代码如下:

  • 45
  • 54
  • 45
  • 120
  • 54
  • 45

现在,给定上述数据,该语句只返回“45”。

但我希望上面的语句返回“45,54,120”(作为字符串)。

我该怎么做?

完整代码:

public System.Data.Entity.DbSet<WebAPI.Models.Product> Products { get; set; }
private ApplicationDbContext db = new ApplicationDbContext();

var product = await db.Products.Select(i =>
                new ProductDTO()
                {
                    Id = i.Id,
                    Created = i.Created,
                    Title = i.Title,                    
                    Codes = i.Products.FirstOrDefault().Code

                }).SingleOrDefaultAsync(i => i.Id == id);

【问题讨论】:

  • 您需要控制器返回代码集合还是这些代码的字符串连接?

标签: entity-framework linq asp.net-web-api2


【解决方案1】:

要转换为逗号分隔的列表:

IEnumerable<string> distinctCodes = i.Products.Select(product => product.Code).Distinct();

return string.Join(",", distinctCodes);

但是如果你的控制器返回一个字符串集合而不是一个串联的字符串可能会更好。

编辑,在 OP 代码更新后:

var DBProduct = await db.Products.SingleOrDefaultAsync(i => i.Id == id);

IEnumerable<string> productCodes = DBProduct.Products.Select(p => p.Code).Distinct();

var product = new ProductDTO()
{
   Id = DBProduct.Id,
   Created = DBProduct.Created,
   Title = DBProduct.Title,                    
   Codes = string.Join(",", productCodes)
};

【讨论】:

  • 我用更多代码更新了我的问题。我不确定如何将您的答案与上面的代码结合起来?
  • 我收到此错误 'LINQ to Entities 无法识别方法 'System.String Join(System.String, System.Collections.Generic.IEnumerable`1[System.String])' 方法,并且此方法无法转换为商店表达式。'
  • 你必须在 string.join 之前打开 AsEnumerable 看看这个example
  • 我现在得到 'IEnumerable 不包含 SingleOrDefaultAsync 的定义'.. :/
【解决方案2】:

我认为DistinctString.Join适合你。请试试这个:

var product = await db.Products.AsEnumerable()//Turn AsEnumarable
.Select(i =>
   new ProductDTO()
   {
     Id = i.Id,
     Created = i.Created,
     Title = i.Title,                    
     Codes = string.Join(",", 
               i.Products.Select(l => l.Code).Distinct())
   }).SingleOrDefaultAsync(i => i.Id == id);

【讨论】:

  • DistinctBy?你的意思是不同的?
  • 是 linq 的扩展方法。如果你想你可以看link
  • thx @AlperTungaArslan 但我得到一个错误'无法将 IEnumerable 隐式转换为字符串(代码是字符串)?
  • 我不确定如何将其合并到我现有的代码中。我用更多代码更新了我的问题?
  • 我现在得到 'IEnumerable 不包含 SingleOrDefaultAsync 的定义'.. :/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多