在我正在处理的MVC应用中,我有两个模型,比方说Foo
和FooBar
。 Foo
与FooBar
相关的一对多(FooBar
s具有存储Foo
ID的属性。
我在服务中保存了一些奇特的Where
条件作为静态函数:
public static System.Linq.Expressions.Expression<Func<Foo, bool>> FancyCondition(int input)
{
return(x => x.Prop1 == input);
}
我是这样写的,因为我期待重复使用它。它在过滤Foo
个对象时确实有效。我这样用它:
var results = dbContex.Foo.Where(FancyCondition(4));
但是现在我需要应用这个条件来过滤FooBar
类型的对象,我无法弄清楚如何做到这一点。当然,我可以复制条件,将所有字段和属性从x.PropertyName
调整为x.Foo.PropertyName
,但这听起来不错。
让我重新解释一下我的问题。我有过滤对象Foo
的条件,我有FooBar
类型的对象,它们总是只与一个Foo
对象相关。我想使用相同的条件过滤FooBar
类型的对象,但我不知道如何使用单个代码实现它。
答案 0 :(得分:0)
由于它是强类型的,你需要一个能够将Foo转换为FooBar的转换器(例如隐式转换运算符)。或者你可以使用动态。
答案 1 :(得分:0)
我和办公室里的其他人谈到了这个问题,他说&#34;如果是SQL查询,你会怎么解决?&#34;。这立即引导我找到解决方案,我可以使用Join
。
IQueryable<FooBar> foobars = dbContex.FooBar.Join<FooBar, Foo, int?, FooBar>(dbContext.Foo.Where(FancyCondition(4)), x => x.FooId, y => y.Id, (x, y) => x);
所以我的错误在于思考如何使用linq解决它,而不是如何使用SQL解决它,然后将其转换为linq。
当然,我愿意接受有关如何实现这一目标的替代建议(特别是那些比我更好的建议)。