我有一个像这样的过滤器类结构
public class SchemeInvestorDataDateFilter
{
public int SchemeId { get; set; }
public int InvestorId { get; set; }
public DateTime Date { get; set; }
}
我正在传递此过滤器对象的列表,以使用像这样的 linq 从数据库获取数据
var schemeIds = filters.Select(x => x.SchemeId);
var investorIds = filters.Select(x => x.InvestorId);
var dates = filters.Select(x => x.Date);
var query = Context.SchemeInvestorDataDates
.Where(x =>
schemeIds.Contains(x.SchemeInvestor.SchemeId) &&
investorIds.Contains(x.SchemeInvestor.InvestorId) &&
dates.Contains(x.Date) &&
!x.IsDeleted
);
一切正常,但这不是我真正想要的正确方法。
我希望它过滤
schemeId + investorId + date
组合的行
所以基本上它应该返回具有此组合匹配的行。
目前返回传入的schemeId、investorId和date的所有排列组合的行。
这是有效的,因为它返回满足我的条件的所有记录,但这不是正确的方法,因为它返回了一些我不想要的额外行。
但我不确定如何在链接中编写查询来检查每个数据库实体的内存过滤器列表的组合。
我知道如何使用 Dapper 来做到这一点,但我正在寻找一种使用 linq 的方法。
有没有办法存在?
编辑
这就是如何使用 dapper 来实现这一点。 (与上面的情况类似)
StringBuilder query = new StringBuilder("select * from schemeinvestors si join (");
for (int i = 0; i < schemeInvestorIds.Count(); i++)
{
var data = schemeInvestorIds.ElementAt(i);
query.Append($"select {data.investorId} as InvestorId, {data.schemeId} as SchemeId");
query.Append(schemeInvestorIds.Count() - 1 == i ? "" : " union ");
}
query.Append(") x on si.InvestorId=x.InvestorId and si.SchemeId=x.SchemeId");
using (var connection = BuildConnection())
{
connection.Open();
return await connection.QueryAsync<SchemeInvestor>(query.ToString());
}
您可以根据
SchemeInvestorDataDates
中的每个值检查每个 Filters
吗?
var query = Context.SchemeInvestorDataDates
.Where(x => filters.Any(filter =>
filter.SchemeId == x.SchemeInvestor.SchemeId &&
filter.InvestorId == x.SchemeInvestor.InvestorId &&
filter.Date == x.Date) &&
!x.IsDeleted);