C# 林奇 : Efficient way to set anonymous type property based on other values in query?

标签 c# linq

// 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
    };

顺便说一句,我不确定你是否正确使用了 > 符号。

关于C# 林奇 : Efficient way to set anonymous type property based on other values in query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38152524/

相关文章:

c# - 调用采用指针引用的非托管库函数

linq - 向我推荐合适的 LINQ 提供程序(SQL 服务器、复杂查询)

c# - LINQ 查询(分组依据)?

c# - Linq Entity Framework

entity-framework - 执行 Entity Framework 集合排序所需的通用函数

c# - 谁能建议一些有用的教程来开发umbraco网站?

c# - 在 C# 中,枚举上的开关是否需要默认大小写?

c# - 从依赖服务访问 UI

javascript - 在 ng-options 中将 C# dateTime 格式化为 AngularJS 日期

c# - 一对多关系的 lambda 表达式