LINQ加入和orderby问题

布莱顿

好吧,我已经为此奋斗了几天,研究LINQ之后,我认为我走在正确的道路上。但是我有一个SQL头脑,有时候很难转换为C#。

我有两个数组,一个按字母顺序排序,另一个按ID排序。我需要按字母顺序排列第二个数组。ID是连接因素。IEAID =P.ID。

这是我的数组和示例值;

private IGenericListItem[] _priceLevels = new IGenericListItem[0];
_priceLevels is in the form of {ID, Name}
{3, A}
{8, B}
{4, C}
{7, D}
{5, E}
{9, F}
{1, G}

编辑:更新了此内容以显示_assignmentControls包含一个子数组。我没有那么疯狂的借口。它实际上包含_priceLevels的副本...

protected ArrayList _assignmentControls = new ArrayList();
_assignmentControls is in the form of {ID, LastPrice, NewPrice, _priceLevels[]}
{1, 1.00, 2.00, _priceLevels}
{2, 1.00, 2.00, _priceLevels}
{3, 1.00, 2.00, _priceLevels}
{4, 1.00, 2.00, _priceLevels}

部分原因是我尝试比较/加入ArrayList和IGenericListItem。

In SQL I would do something like this;
SELECT A.* 
FROM _assignmentControls A JOIN _priceLevels P
    ON A.ID = P.ID
ORDER BY P.Name

这将返回一个_assignmentControls表,该表按_priceLevels中的值排序。

在C#LINQ中,我已经走了很远,但似乎无法做到正确。

        var sortedList =
            from a in _assignmentControls
            join p in _priceLevels on a equals p.ID
            orderby p.Name
            select _assignmentControls;

我在join和orderby下出现红色弯曲,并且p.Name中的p是红色。和A)它不起作用。B)我不确定它会返回sortedList作为按_priceLevels.Name排序的_assignmentControls的排序版本。

编辑:当我将鼠标悬停在“联接”上时,我得到“无法从查询中推断方法'IEnumerable System.Linq.Enumerable.Join(此Enumerable,IEnumerable,Func,Func ....'的类型参数。我是现在研究。

感谢您的光临!

埃里克·利珀特(Eric Lippert)

当我将鼠标悬停在“ join”上时,我得到“IEnumerable System.Linq.Enumerable.Join(this Enumerable,IEnumerable, Func,Func....无法从查询中推断出该方法的类型参数

我可以解释这里发生了什么,以便您可以对其进行跟踪。

当你说

from firstitem in firstcollection
join seconditem in secondcollection on firstkey equals secondkey
select result

编译器将其转换为:

Enumerable.Join(
    firstcollection,
    secondcollection, 
    firstitem=>firstkey, 
    seconditem=>secondkey, 
    (firstitem, seconditem)=>result)

Enumerable.Join 是具有四个类型参数的通用方法:第一个集合的元素类型,第二个集合的元素类型,键类型和结果类型。

如果您遇到该错误,那么根据您提供给编译器的信息,就无法推断出这四件事之一。例如,也许:

  • 第一个集合的类型实际上不是序列。
  • 第二个集合的类型实际上不是序列。
  • 无法推断结果的类型
  • 这两个键的类型不一致,并且没有唯一的最佳类型。

最后一点是最有可能的。例如,假设第一个键是int,第二个键是short由于每个short都可以转换为int,因此int将获胜,第二个键将自动转换为int现在假设第一个键类型为Giraffe,第二个键类型为Tiger两者都不比另一个更好。C#不会说“哦,它们都是Animal,所以我们选择它。” 相反,它表示您没有提供足够的信息来确定您的意思。您应该将其中之一投射到Animal,然后变得很清楚。

有道理?

我有一个半小时的视频,早在2006年就解释了此功能-这是我将有问题的功能添加到编译器中时的视频-因此,如果您需要更深入的说明,请查看一下。

http://ericlippert.com/2006/11/17/a-face-made-for-email-part-three/

更新:我只是再次仔细阅读了您的问题:

部分原因是我尝试比较/加入ArrayList和和IGenericListItem

有问题。无法从中确定序列的类型ArrayList您不应该再使用ArrayList了。实际上,您不应在2005年之后编写的任何代码中使用它。请使用List<T>一些合适的T。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章