c# LINQ:基于查询中的其他值设置匿名类型属性的有效方法

本文关键字:设置 其他 类型 方法 有效 属性 LINQ 于查询 查询 | 更新日期: 2023-09-27 17:54:08

// The "myData" table contains two fields: name, value and type.
// The "myInfo" table contains two fields: type and value.
var myQuery = from x in myData
    select new {
        name = x.name,
        value = x.value,
        minValue = myInfo.Where(y => x.type == y.type).OrderBy(y => y.value).FirstOrDefault().value,
        isOverMinValue = (myInfo.Where(y => x.type == y.type).OrderBy(y => y.value).FirstOrDefault().value) > x.value ? true : false
    };

myInfo表可能包含多条匹配myData类型的记录;我只想要最小值。然后,我希望isOverMinValue字段指示myData中的值是否大于myInfo中的最小值。

在本例中,它可以工作,但是正如您所看到的,我必须重复整个子查询两次。这不可能是有效的。我的替代方法是:

var myQuery = from x in myData
    select new {
        name = x.name,
        value = x.value,
        minValue = myInfo.Where(y => x.type == y.type).OrderBy(y => y.value).FirstOrDefault().value,
        isOverMinValue = false
    };
foreach (var myRec in myQuery)
{
    if (myRec.minValue < x.Value) myRec.isOverMinValue = true;
}

但是这不起作用,因为匿名类型的属性似乎是只读的。

有更有效的方法吗?

(我不能做一个连接,因为就像我说的myInfo可能包含多个条目,并做一个正常的LINQ连接将最终产生许多记录基于在myInfo中找到多少匹配。)

c# LINQ:基于查询中的其他值设置匿名类型属性的有效方法

您可以使用let关键字:

var myQuery = from x in myData
    let minvalue = myInfo.Where(y => x.type == y.type)
                         .OrderBy(y => y.value).FirstOrDefault().value
    select new {
        name = x.name,
        value = x.value,
        minValue = minvalue,
        isOverMinValue = minvalue > x.value
    };

顺便说一下,我不确定你是否把>的符号写对了