我正在尝试使用连接上的3个条件进行查询。但是我收到了一个错误。在sql server
中它完美运行,但当我尝试将其转换为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
(字符串)和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:
SELECT *
FROM db.FavouriteVol FV
INNER JOIN db.Favourite F On F.EType = FV.EType and F.CountryId = FV.CountryId and F.EType = FV.EType
WHERE F.userId = 5
知道如何解决这个问题?
谢谢!
答案 0 :(得分:1)
虽然我不清楚为什么包含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();
答案 1 :(得分:0)
看来你的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 }
)
在LinqToObjects中,该表达式可以正常工作,但在LinqToEntities中无效。
您有两种选择。
您可以将返回集标记为Enumerable,在这种情况下,集合中的所有实体都将返回到客户端并在那里进行过滤(不利于性能)。
您将获得一个匿名类型的对象,其中包含两个属性(您感兴趣的实体)。
注意:我在某种程度上重新设计了查询。我注意到你正在测试是否收藏夹== null。使用Join映射到SQL的INNER JOIN已经为您做好了准备。
var temp = _context
.FavouriteVol
.AsEnumerable()
.Join(
_context.Favourites
.Where(u => u.userId == userId)
.AsEnumerable(),
fv => new { fv.EntityId, fv.CountryId, fv.EType },
f => new { f.EntityId, f.CountryId, f.EType },
(fv, f) => new { FavouriteVol = fv, Favourites = f }
)
.ToList();
或者您必须明确指定所有返回的字段。对于这种方法,您需要仔细命名属性,或者只需创建一个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();