c# - LINQ 按特定列返回不同的值
问题描述
我有一张Colour
这样的桌子:
Id Name VendorId
--------------------
1 Purple NULL
2 Blue NULL
3 Black NULL
4 Purple 1
5 Orange 1
6 Mauve 2
而且我想将所有颜色都VendorId
设为NULL,除非该颜色Name
有一个VendorId
附加的条目,所以例如VendorId = 1
我想要
Id Name VendorId
--------------------
2 Blue NULL
3 Black NULL
4 Purple 1
5 Orange 1
注意带有的Purple
行 ID不在列表中。因为我会得到行和1
NULL VendorId
Id = 2
1,2,3
6
我最初想.Select .Distinct
在 Name 上,但我需要整个对象或至少是 Id
var result = _context.Colours
.Where(x => x.Vendor == null || x.Vendor.Id == vendorId)
.Select(x => x.Name)
.Distinct()
.ToList();
但是如果我使用.Select(x => x.Id).Distinct()
on 那么我会得到两个实例Purple
如何在 LINQ 中实现这一点?
编辑:
我刚刚尝试使用
var result = _context.Colours
.Where(x => x.Vendor == null || x.Vendor.Id == vendorId)
.OrderByDescending(x => x.Id)
.GroupBy(x => x.Name)
.Distinct()
.ToList()
.Select(x => x.First())
.ToList();
试图得到所有null
and id = 1
,然后通过降序 Id 排序并尝试.GroupBy
但我得到了Client side GroupBy is not supported.
解决方案
试一试:
var vendorId = 1;
var result =
_context
.Colours
.Where(x => x.VendorId == null || x.VendorId == vendorId)
.OrderByDescending(x => x.VendorId)
.GroupBy(x => x.Name)
.SelectMany(xs => xs.Take(1))
.OrderBy(x => x.ID)
.ToList();
使用此示例数据:
var colours = new []
{
new { ID = 1, Name = "Purple", VendorId = (int?)null },
new { ID = 2, Name = "Blue", VendorId = (int?)null },
new { ID = 3, Name = "Black", VendorId = (int?)null },
new { ID = 4, Name = "Purple", VendorId = (int?)1 },
new { ID = 5, Name = "Orange", VendorId = (int?)1 },
new { ID = 6, Name = "Mauve", VendorId = (int?)2 },
};
我得到这个结果:
推荐阅读
- azure - 使用 REST 将数据发送到 Azure IoT 中心
- c# - 如何在调用同一类的方法时重置初始化
- node.js - 我应该如何在这里做出准备好的陈述?
- windows - 从带有参数的 Windows 批处理命令运行 live-server 命令
- apache-spark - 如何使用 spark sql 或 hive 更新表的值?
- swt - WindowBuilder SWT 表
- c# - C# 上的 SQLite。选择查询不适用于字符串
- ios - 为什么在 iOS 中不能使用 Swift 和 Xcode 从这个字符串创建这个 URL?
- windows - 为什么 Anaconda 安装程序不建议在 Windows 上将其目录添加到 PATH?
- c++ - 如何管理 C++ 中无法深度复制的资源