.NET Core EF 选择关系具有的对象



我正在尝试弄清楚如何从DBSet中获取模型,其中模型具有具有特定属性的关系模型。

例:

List<Person> persons = context.Person.Where(p => p.Properties.Where(p => p.CountryCode == 1)).ToList();

一个人可以拥有多个财产,我只想获取在特定国家/地区拥有财产的人员列表。

你实际上可以尝试这样的事情,

_unitOfWork.GetRepository<AdvertTrade>()
.GetQueryable()
.AsNoTracking()
// Make sure the advert trade does not have any related to this user
.Include(at => at.UserRatings)
.Where(at => at.Id.Equals(userRating.AdvertTradeId))
.Any(at => at.UserRatings.Any(ur => ur.CreatedBy.Value.Equals(userId) && ur.DeletedOnUtc == null))

而不是垃圾邮件.Where((,我利用 Any(( 来寻找嵌套需求。

为了使事情更清楚,这里有一个示例代码块,旧代码被注释掉,您需要专注于注释的代码(我没有重构它,因为它不好,而是因为我的 ERD 发生了变化(。

var payload = _unitOfWork.GetRepository<CurrencySource>()
.GetQueryable()
.AsNoTracking()
// Make sure all currency sources are not disabled or deleted
.Where(cs => cs.IsEnabled && cs.DeletedOnUtc == null)
//.Include(x=>x.CurrencyPairComponents)
//.ThenInclude(x=>x.CurrencyPair)
//.ThenInclude(x=>x.PartialCurrencyPairs)
//.Include(cs => cs.CurrencyPairs)
//.ThenInclude(cp => cp.PartialCurrencyPairs)
//.ThenInclude(pcp => pcp.Currency)
//.Where(cs => cs.CurrencyPairComponents.Select(x=>x.CurrencyPair)
//    // Make sure all currencypairs are not disabled or deleted
//    .Any(cp => cp.IsEnabled && cp.DeletedOnUtc == null
//               &&
//               // Make sure none of the currency pair's partial currency pair is not disabled or deleted
//               cp.PartialCurrencyPairs
//                   .Any(pcp => pcp.Currency.IsEnabled && pcp.Currency.DeletedOnUtc == null)))
.Select(cs => new
{
id = cs.Id,
abbreviation = cs.Abbreviation,
name = cs.Name
//currencyPairs = cs.CurrencyPairComponents
//    .Select(cp => new
//    {
//        id = cp.Id,
//        partialCurrencyPairs = cp.CurrencyPair.PartialCurrencyPairs
//            .Select(pcp => new
//            {
//                currencyId = pcp.CurrencyId,
//                currency = new
//                {
//                    abbrv = pcp.Currency.Abbrv,
//                    currencyTypeId = pcp.Currency.CurrencyTypeId,
//                    currencyType = new
//                    {
//                        typeShortForm = pcp.Currency.CurrencyTypeId.GetDisplayName(),
//                        name = pcp.Currency.CurrencyTypeId.GetDisplayName()
//                    },
//                    name = pcp.Currency.Name,
//                    walletTypeId = pcp.Currency.WalletTypeId
//                },
//                isMain = pcp.IsMain
//            })
//    })
});

请注意,我嵌套了一些 LINQ 声明。

.Where(cs => cs.CurrencyPairComponents.Select(x=>x.CurrencyPair)
// Make sure all currencypairs are not disabled or deleted
.Any(cp => cp.IsEnabled && cp.DeletedOnUtc == null
&&
// Make sure none of the currency pair's partial currency pair is not disabled or deleted
cp.PartialCurrencyPairs
.Any(pcp => pcp.Currency.IsEnabled && pcp.Currency.DeletedOnUtc == null)))

你显然在尝试加入。 我想你想要(伪代码(

var persons = (from p in Context.Person
join pr in Context.Property on p.ID equals pr.PersonID
where pr.CountryCode == 1
select p).ToList();

最新更新