Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ按特定列返回不同的值_C#_Entity Framework_Linq - Fatal编程技术网

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
行Id
1
不在列表中。对于
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()
,否则它对我不起作用-我的客户端无法处理该操作。