// 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中找到多少匹配。)
您可以使用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
};
顺便说一下,我不确定你是否把>
的符号写对了