gpt4 book ai didi

C# Linq - 获取非空集合的对象

转载 作者:太空狗 更新时间:2023-10-29 17:57:09 25 4
gpt4 key购买 nike

我有:

private Dictionary<int, Сolor[]> colorSet = new Dictionary<int, Сolor[]>()
{
{1, new Сolor[2] {Сolor.Red, Сolor.Green}},
{2, new Сolor[2] {Сolor.Yellow, Сolor.Blue}},
...
};

public class Graph
{
public Сolor Сolor { get; set; }
public ICollection<Point> Points { get; set; }
}

1) 我怎样才能得到 List<Graph>来自 Points 的数据库不为空?

List<Graph> graphs = context.Graphs.Where(g => g.Points.Count > 0).ToList()

2)如何执行?

List<Graph> graphs = context.Graphs.Where(g => colorSet[1].Contains(g.Color)).ToList()

异常(exception)情况是:

LINQ to Entities does not recognize the method '...' method, and this method cannot be translated into a store expression.

最佳答案

使用Enumerable.Contains()没有问题在英孚。这是String.Contains无法翻译。

第二个查询的问题是您将 LINQ 运算符与对象访问代码混合使用,特别是 colorSet[1] . LINQ to EF 不会尝试执行此代码,也不知道如何将其转换为 SQL。

解决方案是先将colorSet值存入变量:

var colors = colorSet[1];
List<Graph> graphs = context.Graphs
.Where(g => colors.Contains(g.Color))
.ToList();

LINQ to EF 知道翻译Enumerable<T>.Contains()AND Color IN (0,1)子句

这假设您至少使用 EF 5,Color是一个枚举,Point 是一个自定义类,例如:

public enum Color
{
Red,
Green,
Blue,
Yellow
}
public class Point
{
public int Id { get; set; }
public int X { get; set; }
public int Y { get; set; }
}

更新

对于第一个问题,您可以使用Any() 检索具有任意点的图形。 :

var graphs=context.Graphs
.Where(g => g.Points.Any())
.ToList();

Linq to EF 将生成带有 WHERE EXISTS 的 SQL 语句子句例如

WHERE  EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[Points] AS [Extent2]
WHERE [Extent1].[Id] = [Extent2].[Graph_Id]
)

这将返回包含点但不包含点本身的图形。当您尝试访问 Points 时,这些将以惰性方式加载图对象的属性。如果您只想访问少数 Points,这可能会提高性能属性,但如果您想访问所有属性,将导致大量查询(N+1 问题)

如果你也想加载积分,你需要使用 Include()方法,例如:

var graphs=context.Graphs
.Include(g => g.Points)
.Where(g => g.Points.Any())
.ToList();

这将在图形和点之间执行左连接,并在单个查询中返回所有数据。

关于C# Linq - 获取非空集合的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30475074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com