gpt4 book ai didi

c# - 使用多个源表时如何重用 'Where' 的 linq 表达式

转载 作者:太空狗 更新时间:2023-10-29 20:28:38 25 4
gpt4 key购买 nike

让我们有以下内容:

public interface IOne {
UInt64 Id { get; }
Int16 Size { get; }
}

public interface ITwo {
UInt64 OneId { get; }
Int16 Color { get; }
}

如解释here重用 linq 表达式的方法是这样写:

public static Expression<Func<IOne, bool>> MyWhereExpression( int value ){
return (o) => (o.Size > value);
}

int v = 5;
IQueryable<IOne> records = from one in s.Query<IOne>()
.Where(MyWhereExpression(v))
select one;

当我想对两个表执行相同操作时遇到问题。

表达式:

public static Expression<Func<IOne, ITwo, bool>> MyWhereExpression2(int color ) {
return (one,two) => (one.Id == two.OneId) && (two.Color > color );
}

链接 1:

int color = 100;
IQueryable<IOne> records = from one in s.Query<IOne>()
from two in s.Query<ITwo>()
.Where(MyWhereExpression2(color))
select one;

这不起作用,因为 .Where 仅坚持第二个 from

链接 2:

int color = 100;
IQueryable<IOne> records = (from one in s.Query<IOne>()
from two in s.Query<ITwo>()
select new { one, two })
.Where(MyWhereExpression2(color));

这导致

Argument 2: cannot convert from 'Expression<System.Func<IOne,ITwo,bool>>' to 'System.Func<AnonymousType#1,int,bool>'

我理解有关 AnonymousType 的错误消息,但我不知道如何编写查询。

我想用表达式而不是写的原因

where (one.Id == two.OneId) && (two.Color > color ) 

直接在linq查询中是因为我想在多个linq查询中重用这个表达式。

最佳答案

目前可能有一个更优雅的解决方案,但您可以使用 Tuple<IOne, ITwo>而不是匿名类型:

static Expression<Func<Tuple<IOne, ITwo>, bool>> MyWhereExpression2(int color) {
return t => (t.Item1.Id == t.Item2.OneId) && (t.Item2.Color > color);
}

int color = 100;
IQueryable<IOne> records = (from one in s.Query<IOne>()
from two in s.Query<ITwo>()
select Tuple.Create(one, two))
.Where(MyWhereExpression2(color))
.Select(t => t.Item1);

更新: 我可能在上面回答得太快了,因为这不适用于 Linq to SQL,因为对 Tuple.Create 的调用无法转换为 SQL。要使用 Linq to SQL,目前我看到的唯一解决方案是创建命名类型:

class Pair
{
public IOne One { get; set; }
public ITwo Two { get; set; }
}

static Expression<Func<Pair, bool>> MyWhereExpression2(int color) {
return p => (p.One.Id == p.Two.OneId) && (p.Two.Color > color);
}

int color = 100;
IQueryable<IOne> records = (from one in s.Query<IOne>()
from two in s.Query<ITwo>()
select new Pair { One = one, Two = two })
.Where(MyWhereExpression2(color))
.Select(p => p.One);

关于c# - 使用多个源表时如何重用 'Where' 的 linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8264207/

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