Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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# 嵌套在.Where()中的.Select()_C#_Sql_Linq - Fatal编程技术网

C# 嵌套在.Where()中的.Select()

C# 嵌套在.Where()中的.Select(),c#,sql,linq,C#,Sql,Linq,我在游戏表和游戏类型之间有一种多对多的关系。在分析过程中,我需要从符合特定标准的游戏中获取项目 问题是,为了检查这个标准,我需要分析这个特定游戏的类型。林克不会让我做的 我的请求现在如下所示: var result = GDB.Games.Where((g)=> g.GamesToGenres.Select((gtg)=> (weights.ContainsKey(gtg.Genre.Name) ? weights[gtg.Genre.Name]:0.0) ).Sum

我在游戏表和游戏类型之间有一种多对多的关系。在分析过程中,我需要从符合特定标准的游戏中获取项目

问题是,为了检查这个标准,我需要分析这个特定游戏的类型。林克不会让我做的

我的请求现在如下所示:

var result = GDB.Games.Where((g)=>
  g.GamesToGenres.Select((gtg)=>
    (weights.ContainsKey(gtg.Genre.Name) ? weights[gtg.Genre.Name]:0.0)
  ).Sum() > Threshhold
).ToArray();
当我执行它时,我收到SQL异常

选择时,只能在选择列表中指定一个表达式 子查询不随EXISTS一起引入

有解决办法吗?我如何在何处执行这样的选择

编辑:权重是一本字典

编辑:我在和兰博达斯玩,发现他们的行为很奇怪: 此代码无法工作,引发nvarchar到浮点转换异常:

Func<string, double> getW = (name) => 1;
var t = GDB.Games.Where((g)=>
  g.GamesToGenres.Select((gtg)=>
    getW(gtg.Genre.Name)
  ).Sum() > Threshhold
).ToArray();
这让我得出结论,linq Lambda不是常见的Lambda。那他们怎么了?它们的局限性是什么?在他们里面我能做什么不能做什么?为什么我可以在lambda中放置一个.select调用,而不是我自己的getW调用


决心。见下面的答案。长话短说,除非有明确的说明,否则C不能成为克隆人。如果有人知道更好的答案,我仍然感到困惑。

您的问题是,您试图从字典权重中选择一些存在于应用程序中而不是数据库中的内容。如果这是对数据库的查询结果,请使用查询。Single。。。取而代之的是

嗯,我的困惑超出了想象。以下代码可以完美地工作:

Func<Game, bool> predicate = (g) =>
  g.GamesToGenres.Select((gtg) =>
    (weights.ContainsKey(gtg.Genre.Name) ? weights[gtg.Genre.Name] : 0.0)
  ).Sum() > Threshhold;

var t = GDB.Games.Where(predicate).ToArray();

细心的读者可能会说嘿!这不是你在问题中写的代码吗?您刚刚显式地将其分配给了一个变量!,他是对的。现在看来,C lambda处理器是一个组件,只有在显式声明lambda时,它才会创建clojure。如果有人能向我描述这一现象,我将不胜感激,因为现在我比一个新生儿更困惑。

您可以将SQL数据与本地数据(如字典等)结合起来,但有一个限制。您需要首先从SQL中选择数据。这意味着,如果您将GDB.Games.Where替换为GDB.Games.ToList.Where,代码将正常工作。您可以询问性能,但可以选择一部分数据,如GameId、流派名称等,然后过滤掉游戏。然后按游戏ID列表返回完整游戏信息的结束列表。

权重来自何处?LINQ lambda通常是lambda,但它们由LINQ to SQL引擎解析并转换为SQL。有些事情不能在SQL中完成,而这些事情可以在纯C代码中完成,这就是问题的根源。@siride lambda在解析为可查询的扩展方法时是LambdaExpression实例@Gusdor:LambdaExpression表示lambda构造,但它本身不是lambda,因为lambda存在于语言中。使用SQLException来表达这一点是非常有趣的,我从来没有想到过。有没有办法在查询中使用自定义对象?这本词典是用大量的数学知识构建的,我不想在SQLnot中实现它。您需要做的是在聚合和聚合客户端之前预测您的结果。好的,先生,我做了您认为不可能的事情。我添加它作为一个单独的答案,但简而言之,我只是将.Where中的所有内容包装到一个lambda中,该lambda被分配给一个变量,然后将该变量传递到.Where中。它成功了。你对此有什么解释吗?它正在做我说过你需要做的事情——Func是IEnumerable的扩展,而不是IQueryable。这意味着您的解决方案是枚举DbSet游戏,然后应用过滤器。因此,过滤是在客户端进行的,在客户端存在字典……这很令人困惑。一直以来,我都确信我在使用Func重载。我记得我想知道为什么lambda不能计算为var,并阅读了一些表达式,但我没想到它们会出现。非常感谢,这将清除所有内容。请参阅对我的答案的评论-过滤发生在客户端,而不是数据库
Func<Game, bool> predicate = (g) =>
  g.GamesToGenres.Select((gtg) =>
    (weights.ContainsKey(gtg.Genre.Name) ? weights[gtg.Genre.Name] : 0.0)
  ).Sum() > Threshhold;

var t = GDB.Games.Where(predicate).ToArray();