C# 连接两个IQueryable

C# 连接两个IQueryable,c#,entity-framework,linq,C#,Entity Framework,Linq,C#/实体框架问题: 我有反对意见 Account { public string AccountId { get; set; } public string UserId { get; set; } public string CurrencyId { get; set; } } 然后我需要返回“用户A”上的所有帐户,这些帐户与“用户B”的帐户具有相同的currencyId 这是一个简单的SQL查询,但我坚持使用EF。这就是我试过的 public IQueryable&l

C#/实体框架问题: 我有反对意见

Account 
{
   public string AccountId { get; set; }
   public string UserId { get; set; }
   public string CurrencyId { get; set; }
}
然后我需要返回“用户A”上的所有帐户,这些帐户与“用户B”的帐户具有相同的currencyId

这是一个简单的SQL查询,但我坚持使用EF。这就是我试过的

public IQueryable<Account> Test(string userA, string userB)
{
    var accountsA = GetAccounts().Where(x => x.UserId == userA);
    var accountsB = GetAccounts().Where(x => x.UserId == userB);

    return accountsA.Join(
            accountsB,
            acc1 => acc1.CurrencyId,
            acc2 => acc2.CurrencyId,
            (acc1, acc2) => acc1
        );
}
publicIQueryable测试(stringusera,stringuserb)
{
var accountsA=GetAccounts(),其中(x=>x.UserId==userA);
var accountsB=GetAccounts(),其中(x=>x.UserId==userB);
返回帐户a.加入(
问某人,
acc1=>acc1.CurrencyId,
acc2=>acc2.CurrencyId,
(acc1,acc2)=>acc1
);
}
此查询可以工作,但会返回大量userA的重复帐户

我试过了

public IQueryable<Account> Test(string userA, string userB)
{
    var accountsA = GetAccounts().Where(x => x.UserId == userA);
    var accountsB = GetAccounts().Where(x => x.UserId == userB);

    return accountsA.GroupJoin(
            accountsB,
            acc1 => acc1.CurrencyId,
            acc2 => acc2.CurrencyId,
            (acc1, acc2) => acc1
        );
}
publicIQueryable测试(stringusera,stringuserb)
{
var accountsA=GetAccounts(),其中(x=>x.UserId==userA);
var accountsB=GetAccounts(),其中(x=>x.UserId==userB);
返回帐户a.GroupJoin(
问某人,
acc1=>acc1.CurrencyId,
acc2=>acc2.CurrencyId,
(acc1,acc2)=>acc1
);
}
但它与

System.InvalidOperationException
  HResult=0x80131509
  Message=Processing of the LINQ expression 'DbSet<Account>
    .Where(x => x.UserId == "userA").GroupJoin(
        outer: DbSet<Account>
            .Where(x => x.UserId == "userB"), 
        inner: acc1 => acc1.CurrencyId, 
        outerKeySelector: acc2 => acc2.CurrencyId, 
        innerKeySelector: (acc1, acc2) => acc1)' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
System.invalidoOperationException
HResult=0x80131509
消息=LINQ表达式“DbSet”的处理
.Where(x=>x.UserId==“userA”).GroupJoin(
外部:DbSet
。其中(x=>x.UserId==“userB”),
内部:acc1=>acc1.CurrencyId,
outerKeySelector:acc2=>acc2.CurrencyId,
“NavigationExpandingExpressionVisitor”的innerKeySelector:(acc1,acc2)=>acc1)”失败。这可能表明EF核心中存在缺陷或限制。看见https://go.microsoft.com/fwlink/?linkid=2101433 更多详细信息。
如何对EF查询执行DISTINCT操作?

公共IQueryable测试(字符串userA,字符串userB)
public IQueryable<Account> Test(string userA, string userB)
{
    var accountsA = GetAccounts().Where(x => x.UserId == userA);
    var accountsB = GetAccounts().Where(x => x.UserId == userB);

    return accountsA.Where(accountA => 
         accountsB.Any(accountB => accountB.CurrencyId == accountA.CurrencyId)
    );
}
{ var accountsA=GetAccounts(),其中(x=>x.UserId==userA); var accountsB=GetAccounts(),其中(x=>x.UserId==userB); 返回accountsA.Where(accountA=> accountsB.Any(accountB=>accountB.CurrencyId==accountA.CurrencyId) ); }
好的,我找到了。它是 .Distinct()

所以答案是

    var a1 = accountContext.Account.Where(x => x.UserId == "userA");
    var a2 = accountContext.Account.Where(x => x.UserId == "userB");
    var result = a1.Join(
            a2,
            acc1 => acc1.CurrencyId,
            acc2 => acc2.CurrencyId,
            (acc1, acc2) => acc1
        )
        .Distinct();

因此,用户B有零个或多个
帐户
,其中每个
帐户
都有一个
CurrencyId

我需要返回“用户A”上与用户B的currencyId相同的所有帐户

显然,我们需要用户B的currencyID`

int idUserB = ...
var currencyIdsOfUserB = GetAccounts()
    .Where(account => account.Id == idUserB)
    .Select(account => account.CurrencyId)
    .Distinct();                              // only if you expect duplicates
用户A的所有帐户至少具有以下CurrencyID之一:

int idUserA:
var result = GetAccounts.Where(account => account.Id == idUserB
             && currencyIdsOfUserB.Contains(account.CurrencyId);

Accounts
Id UserId CurrencyId
01   09      18
02   10      50
03   11      19
04   20      49
05   10      51
06   10      52
07   20      52
08   20      51
09   10      50
10   20      52
  • 用户[10]的帐户2、5、6、9的货币ID为50、51、52、50

  • 用户[20]的帐户4、7、8、10的货币ID为49、52、51、52

  • currenciidsofuserb={50,51,52}

  • 给我所有UserId等于[10]且CurrencyId在{50,51,52}中的帐户。 结果将是Id为7、8、10的帐户

简单的问候