C# 实体框架(在中使用并选择Distinct)
我是Entity Framework 6.0的新手,遇到了一种情况,我想在我的C应用程序中执行一个类似于此SQL查询的查询:C# 实体框架(在中使用并选择Distinct),c#,entity-framework,C#,Entity Framework,我是Entity Framework 6.0的新手,遇到了一种情况,我想在我的C应用程序中执行一个类似于此SQL查询的查询: select * from periods where id in (select distinct periodid from ratedetails where rateid = 3) 在EF中是否真的可以执行这样的查询,或者我是否需要将其分解为更小的步骤 是的,这是可以做到的,但是你应该为你的查询提供一个更好的例子。你已经提供了一个糟糕的起点。让我们用这个: SE
select * from periods where id in (select distinct periodid from ratedetails where rateid = 3)
在EF中是否真的可以执行这样的查询,或者我是否需要将其分解为更小的步骤 是的,这是可以做到的,但是你应该为你的查询提供一个更好的例子。你已经提供了一个糟糕的起点。让我们用这个:
SELECT value1, value2, commonValue
FROM table1
WHERE EXISTS (
SELECT 1
FROM table2
WHERE table1.commonValue = table2.commonValue
// include some more filters here on table2
)
首先,它几乎总是更好地使用EXISTS而不是IN
现在把它转换成一个Lambda应该是这样的,同样的,你没有提供对象或对象图,所以我会编一些东西
DbContext myContext = this.getContext();
var myResults = myContext.DbSet<Type1>().Where(x => myContext.DbSet<Type2>().Any(y => y.commonValue == x.commonValue)).Select(x => x);
你要找的拉姆达声明
DbContext myContext = this.getContext();
var myResults = myContext.DbSet<Periods>()
.Where(x => myContext.DbSet<RateDetails>().Any(y => y.periodid == x.id && y.rateid == 3))
.Select(x => x);
这里是学习lamda以及如何使用它们的一个很好的起点
这是查询中的第二个where子句
var priodidList=ratedetails.where(x=>x.rateid ==3).DistinctBy(x=>x.rateid);
现在是查询的第一部分
var selected = periods.Where(p => p.id
.Any(a => priodidList.Contains(a.periodid ))
.ToList();
假设您的上下文类中有: 数据集周期 DbSet费率详细信息 您可以使用以下Linq:
var distincts = dbContext.RateDetails
.Where(i => i.rateId == 3)
.Select(i => i.PeriodId)
.Distinct();
var result = dbContext.Periods
.Where(i => i.Id)
.Any(j => distincts.Contains(j.Id));
编辑:根据您的实体,您可能需要一个自定义比较器来进行区分。您可以找到教程,也可以
或者使用更多Linq魔术来分割结果。此查询与“从ratedetails中选择*其中rateid=x”有什么区别?我的帖子中翻转了查询。对不起,请再次检查。如下所述,您应该使用IN或JOIN而不是IN子句,如果你在谷歌上搜索,你可以找到更多像这样的文章。它还使sql或lamda更具可读性。谢谢,正如我暗示的,我还在学习。我也很感激参考链接。
var distincts = dbContext.RateDetails
.Where(i => i.rateId == 3)
.Select(i => i.PeriodId)
.Distinct();
var result = dbContext.Periods
.Where(i => i.Id)
.Any(j => distincts.Contains(j.Id));