C# LINQ按特定列返回不同的值
我有一张C# LINQ按特定列返回不同的值,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一张颜色的表格,如下所示: Id Name VendorId -------------------- 1 Purple NULL 2 Blue NULL 3 Black NULL 4 Purple 1 5 Orange 1 6 Mauve 2 我想把VendorId的所有颜色都设为空,除非该颜色Name有一个附加了VendorId的条目,例如,对于VendorId=1,我希望 Id Name VendorId ---------
颜色的表格,如下所示:
Id Name VendorId
--------------------
1 Purple NULL
2 Blue NULL
3 Black NULL
4 Purple 1
5 Orange 1
6 Mauve 2
我想把VendorId
的所有颜色都设为空,除非该颜色Name
有一个附加了VendorId
的条目,例如,对于VendorId=1
,我希望
Id Name VendorId
--------------------
2 Blue NULL
3 Black NULL
4 Purple 1
5 Orange 1
注意,带有NULL VendorId
的Purple
行Id1
不在列表中。对于Id=2
我会得到1,2,3
和6
起初我想在名称上选择.Distinct
,但我需要整个对象或至少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()
,那么我会得到两个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
和id=1
,然后按id降序并尝试。GroupBy
但我得到的客户端GroupBy不受支持。
试一试:
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 },
};
我得到这个结果:
这一条对我有效,并产生了预期的结果:
var idOrNameNotWithId =
colours.Where(x => x.VendorId == cid ||
(!x.VendorId.HasValue && !colours.Where(x => x.VendorId == cid).Select(x => x.Name).ToList().Contains(x.Name)))
.ToList();
它背后的思想是:任何带有expect cid(color ID)的东西,或者任何为空的东西,但是只有当你获取任何带有ID的东西时,颜色的名称不在那里
以及完整的工作方法。我借用了@Enigmativity的答案中的颜色集合定义
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
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 },
};
var cid = 2;
var idOrNameNotWithId =
colours.Where(x => x.VendorId == cid ||
(!x.VendorId.HasValue && !colours.Where(x => x.VendorId == cid).Select(x => x.Name).ToList().Contains(x.Name)))
.ToList();
}
}
}
这是一个非常有趣的异常:由“NavigationExpandingExpressionVisitor”处理LINQ表达式“xs=>xs.Take(1)”失败。这可能表明EF核心中存在缺陷或限制。看见https://go.microsoft.com/fwlink/?linkid=2101433
-我想我可以在点上添加一些ToList()
来修复它。。。也许…对于其他遇到同样问题的人,我在.OrderByDescending()
之后的链中添加了.ToList()
,否则它对我不起作用-我的客户端无法处理该操作。