gpt4 book ai didi

linq-to-sql - Linq2SQL 表达式中的代码共享选项

转载 作者:行者123 更新时间:2023-12-04 07:04:13 24 4
gpt4 key购买 nike

我有一对包含相同复杂 Where 子句的 Linq to SQL 查询,特别是:

where ((range.MinimumFrequency <= minFreq &&  minFreq <= range.MaximumFrequency)
|| (range.MinimumFrequency <= maxFreq && maxFreq <= range.MaximumFrequency)
|| (range.MinimumFrequency <= minFreq && maxFreq <= range.MaximumFrequency)
|| (range.MinimumFrequency >= minFreq && maxFreq >= range.MaximumFrequency))

而不是复制和粘贴这块代码到处都是,我想将它重构为可以共享的其他内容。我知道我不能用普通的方法来做到这一点,因为它不能被翻译成 SQL,但我也不能得到

Expression < Func<...>>



东西 described here要么工作。

如果我在这里出于理智的目的简化 where 子句,我想转向
where (range.MinumumFrequency < minFreq) 

变成一个表达式,所以我试过:
public static Expression<Func<FreqRange, bool>> Overlaps(decimal minMHz, decimal maxMHz)
{
return (range => range.MinimumFrequency <= minMHz);
}

这似乎可以编译,但我似乎无法让 where 语句起作用,我尝试了以下操作:
where FreqRange.Overlaps(minMHz, maxMHz)

但这给了我一个编译时错误:

Cannot implicitly convert type 'System.Linq.Expressions.Expression>' to 'bool'



有任何想法吗?另外,假设我们得到了这个工作,我可以简单地扩展 Expression < Func <>> 中的 lambda 表达式以包括其他条件吗?

最佳答案

如果您使用语言构建的 LINQ 语法,则您隐式声明了一个 Lamba 表达式——而该 Lamba 表达式是一个 Expression<Func <>> - 所以你不需要 where 子句来返回表达式,你需要它是表达式。

例如

var q = from row in myTable
where row.a < aMax
select row.b;

// which translates to

var q = myTable.Where(row => row.a < aMax).Select(row => row.b);

现在您需要“缓存” row => row.a < aMax - 不仅仅是 row.a < aMax 的值,如果你愿意。所以,如果你要写这样的东西......
Expression<Func<?,bool>> cachedExpression = row => row.a < aMax;

var q = from row in myTable
where cachedExpression
select row.b;

好吧,你是说“在那里,给定一行,它是真的(给定一行,row.a 小于 aMax 是真的)”。这是无稽之谈,如果 cachedExpression 的类型是 Expression<Func<?,bool>> 则不会编译而 myTable 是 LinqToSql 提供的表。它会转化为这样的东西:
Expression<Func<?,bool>> cachedExpression = row => row.a < aMax;

//nonsense .Where:
var q = myTable.Where(row => cachedExpression).Select(row => row.b);
//effectively says this:
var q = myTable.Where(row => (row0 => row0.a < aMax)).Select(row => row.b);

现在,这是合法的,因为 linq 查询提供程序可以实现具有非 bool 值的 where 子句,但这是一件非常奇怪的事情;当然没有标准的 linq 提供程序(例如 Linq to Sql)会做这样的事情。

那你该怎么办?就像是:
//not .Where(row=>cachedExpression)!
var q = myTable.Where(cachedExpression).Select(row => row.b);

//or, alternatively:
var q = from filteredRow in myTable.Where(cachedExpression)
select filteredRow.b;

关于linq-to-sql - Linq2SQL 表达式中的代码共享选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1362263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com