Linq c# - 加入多个条件错误

时间:2015-04-22 11:23:30

标签: c# .net linq entity-framework

我正在尝试使用连接上的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

知道如何解决这个问题?

谢谢!

2 个答案:

答案 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();