Linq c#-连接多个条件错误

Linq c#-连接多个条件错误,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我正在尝试对联接使用3个条件进行查询。但是我犯了一个错误。在sqlserver中,它工作得很好,但是当我尝试将它转换为linq时,它给了我一个错误 您可以查看下面的错误和查询 查询: var temp = _context .FavouriteVol .Join(_context.Favourites, fv => new { fv.EntityId, fv.

我正在尝试对联接使用3个条件进行查询。但是我犯了一个错误。在
sqlserver
中,它工作得很好,但是当我尝试将它转换为
linq
时,它给了我一个错误

您可以查看下面的错误和查询

查询:

var temp = _context
                   .FavouriteVol
                   .Join(_context.Favourites,
                            fv => new { fv.EntityId, fv.CountryId, fv.EType },
                            f => new { f.EntityId, f.CountryId, f.EType },
                                (fv, f) => new { Favourites = f, FavouriteVol = fv })
                                .Where(u => u.Favourites.userId == userId)
                                .Select(f => f.Favourites)
                                .ToList();
注意:
EntityId
(int)、
CountryId
(string)和
EType
(int)`。 问题在于字符串。但我也需要带字符串的过滤器,所以知道怎么做吗

错误:

方法'System.Linq.Queryable.Join(System.Linq.IQueryable, System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>, System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>) 无法从用法推断

Sql:

你知道我该怎么解决这个问题吗


谢谢

您的Join子句中的选择器似乎是问题所在

.Join(_context.Favourites,
       fv => new { fv.EntityId, fv.CountryId, fv.EType },
       f => new { f.EntityId, f.CountryId, f.EType },
       (fv, f) => new { Favourites = f, FavouriteVol = fv }
)
在LinqToObject中,该表达式可以正常工作,但在LinqToEntities中无效

您有两个选择。

您可以将返回集标记为可枚举的,在这种情况下,这些集合中的所有实体都将返回到客户端并在那里进行过滤(对性能不利)。
您将返回一个匿名类型的对象,该对象包含两个属性(您感兴趣的实体)

注意:我对查询做了一些修改。我注意到您正在测试Favorites==null。通过一个映射到SQL内部联接的联接,这已经为您解决了

或者,您必须显式指定所有返回的字段。对于这种方法,您需要仔细命名属性,或者只创建一个DTO(数据传输对象)来保存您感兴趣的返回值

var temp = _context
             .FavouriteVol
             .Join(
                _context.Favourites
                      .Where(u => u.userId == userId),
                fv => new { fv.EntityId, fv.CountryId, fv.EType },
                f => new { f.EntityId, f.CountryId, f.EType },
                (fv, f) => new { 
                   EntityId = fv.EntityId, 
                   CountryId = fv.CountryId, 
                   EType = fv.EType, 
                   //<other fv properties>, 
                   UserId = f.UserId, 
                   //<other f properties>  
                }
             )
             .ToList();
var temp=\u上下文
收藏
.加入(
_背景。最爱
。其中(u=>u.userId==userId),
fv=>new{fv.EntityId,fv.CountryId,fv.EType},
f=>new{f.EntityId,f.CountryId,f.EType},
(fv,f)=>新{
EntityId=fv.EntityId,
CountryId=fv.CountryId,
EType=fv.EType,
//, 
UserId=f.UserId,
//  
}
)
.ToList();

虽然我不清楚为什么包含
CountryId的连接会导致此错误,但您可以通过分别匹配
CountryId
来解决此问题:

var temp = _context
           .FavouriteVol
           .Join(_context.Favourites,
                    fv => new { fv.EntityId, fv.EType },
                    f => new { f.EntityId, f.EType },
                        (fv, f) => new { Favourites = f, FavouriteVol = fv })
                        .Where(u => u.Favourites.userId == userId
                                 && u.Favourites.CountryId == u.FavouriteVol.CountryId)
                        .Select(f => f.Favourites)
                        .ToList();

EntityId
CountryId
EType
属性的确切类型是什么?@GertArnold
EntityId
(int)、
CountryId
(string)和
EType
(int)知道如何修复它吗?我无法更改数据库中的类型。@GertArnold问题在于字符串。你知道解决这个问题的办法吗?:)好吧,我想是因为如果我去掉了绳子,它就正常工作了
(=>new{fv.EntityId,fv.EType},f=>new{f.EntityId,f.EType},)
我不知道为什么:两个国家/地区列都是数据库上的
字符串(例如“IRL”)。我知道这有点混乱,但我没有创建这个应用程序。我只是想解决一个问题,我需要它。我不知道为什么这个条件不能与
字符串一起工作。是否有任何建议或事情试图让它工作起来?“看来您的Join子句中的选择器是问题所在”。那么,为什么没有CountryId的联接可以毫无问题地工作呢?老实说,我通常不会在联接或投影中使用匿名类型。我倾向于提前定义DTO,因为我被同一程序集中具有不同底层类型的不同位置中类似命名的匿名类型字段烧坏了。我还做了很多连接,涉及不同类型的字段int、string和DateTime,它们都混合在一起。也许如果您给我FavoriteVol和Favorites的模式,我可以创建一个示例并证明我的方法。如果您发现为什么不能在
连接
上设置
国家
(字符串)并在
何处进行设置,请告诉我。谢谢你的时间!
var temp = _context
             .FavouriteVol
             .Join(
                _context.Favourites
                      .Where(u => u.userId == userId),
                fv => new { fv.EntityId, fv.CountryId, fv.EType },
                f => new { f.EntityId, f.CountryId, f.EType },
                (fv, f) => new { 
                   EntityId = fv.EntityId, 
                   CountryId = fv.CountryId, 
                   EType = fv.EType, 
                   //<other fv properties>, 
                   UserId = f.UserId, 
                   //<other f properties>  
                }
             )
             .ToList();
var temp = _context
           .FavouriteVol
           .Join(_context.Favourites,
                    fv => new { fv.EntityId, fv.EType },
                    f => new { f.EntityId, f.EType },
                        (fv, f) => new { Favourites = f, FavouriteVol = fv })
                        .Where(u => u.Favourites.userId == userId
                                 && u.Favourites.CountryId == u.FavouriteVol.CountryId)
                        .Select(f => f.Favourites)
                        .ToList();