如果您try 查找包含查询中的流派的实体(它们也可能包含查询中不包含的其他流派),则会出现错误.我try 了许多 Select ,但最终收到了3个请求.
Genres是一个列表字符串.
query = query.Where(g => request.genres.All(r => g.Genres.Any(gameGenre => gameGenre.Equals(new StringForGame(r)))));
System.InvalidOperationException:LINQ表达式‘r=>;ShaedQueryExpression: 查询表达式: 投影贴图: EmptyProjectionMember->;EntiyProjectionExpression:StringForGame Select 1 从游戏流派到g ShaperExpression:EntiyShaperExpression: GameProfile.Domain.Entities.GameEntites.Game.Genres#StringForGame ValueBufferExpression: 项目绑定表达式:EmptyProjectionMember IsNullable:False
.Where(名称参数{0}=>;对象.等于( ObjA:(Object)EF.Property(EntityShaperExpression: GameProfile.Domain.Entities.GameEntites.Game ValueBufferExpression: 项目绑定表达式:EmptyProjectionMember IsNullable:False ,"ID"), ObjB:(Object)EF.Property(nameless参数{0},"GameID")) .AsQueryable() .无法翻译Any(o=>;o.GameString.Equals(new StringForGame(R)‘.
query = query.Where(g => g.Genres.Any(gg => request.genres.All(r=> gg.GameString == r)));
System.InvalidOperationException:LINQ表达式‘r=>;EntityShaperExpression: GameProfile.Domain.Entities.GameEntites.Game.Genres#StringForGame ValueBufferExpression: 项目绑定表达式:EmptyProjectionMember IsNullable:False 无法转换.GameString==r‘.
这个查询可以工作,但没有给出我需要的结果.
query = query.Where(g => g.Genres.Any(gg => request.genres.Contains(gg.GameString)));
// and this too
query = query.Where(g => g.Genres.All(gg => request.genres.Contains(gg.GameString)));
对于上下文
public async Task<List<Game>> Handle(GetGamesQuery request, CancellationToken cancellationToken)
{
var query = _context.Games.AsQueryable();
if (request.sort == "titleAtoZ")
{
query = query.OrderBy(x => x.Title);
}
else if (request.sort == "titleZtoA")
{
query = query.OrderByDescending(x => x.Title);
}
else if (request.sort == "dateAscending")
{
query = query.OrderBy(x => x.ReleaseDate);
}
else if (request.sort == "dateDescending")
{
query = query.OrderByDescending(x => x.ReleaseDate);
}
if (request.releaseDateOf != DateTime.MinValue && request.releaseDateTo != DateTime.MinValue)
{
query = query.Where(x => x.ReleaseDate >= request.releaseDateOf && x.ReleaseDate <= request.releaseDateTo);
}
else if (request.releaseDateOf == DateTime.MinValue && request.releaseDateTo != DateTime.MinValue)
{
query = query.Where(x => x.ReleaseDate <= request.releaseDateTo);
}
else if (request.releaseDateOf != DateTime.MinValue && request.releaseDateTo == DateTime.MinValue)
{
query = query.Where(x => x.ReleaseDate >= request.releaseDateOf);
}
if (request.nsfw == "yes")
{
query = query.Where(x => x.Nsfw == true);
}
else if (request.nsfw == "no")
{
query = query.Where(x => x.Nsfw == false);
}
if (request.genres is not null && request.genres.Count > 0)
{
query = query.Where(g => g.Genres.Any(gg => request.genres.Contains(gg.GameString)));
//query = query.Where(g => g.Genres.Any(gg => request.genres.All(r=> gg.GameString == r)));
//query = query.Where(g => request.genres.All(r => g.Genres.Any(gameGenre => gameGenre.Equals(new StringForGame(r)))));
}
int skipGame = request.page * 50;
query = query.Skip(skipGame).Take(50);
var games = await query.ToListAsync(cancellationToken);
return games;
}
public sealed class Game : Entity
{
public Game(Guid id,
string title,
DateTime releaseDate,
Uri headerImage,
bool nsfw,
string description,
ICollection<StringForGame> developers,
ICollection<StringForGame> publishers,
ICollection<StringForGame> genres,
ICollection<UriForGame> screenshots,
ICollection<UriForGame> shopsLinkBuyGame,
int achievementsCount) : this(id,title,releaseDate,headerImage,nsfw,description,achievementsCount)
{
Developers = developers;
Publishers = publishers;
Genres = genres;
Screenshots = screenshots;
ShopsLinkBuyGame = shopsLinkBuyGame;
}
/// <summary>
/// EF constructor
/// </summary>
private Game(Guid id,
string title,
DateTime releaseDate,
Uri headerImage,
bool nsfw,
string description,
int achievementsCount) : base(id)
{
Title = title;
ReleaseDate = releaseDate;
HeaderImage = headerImage;
Nsfw = nsfw;
Description = description;
AchievementsCount = achievementsCount;
}
public string Title { get; private set; }
public DateTime ReleaseDate { get; private set; }
public Uri HeaderImage { get; private set; }
public bool Nsfw { get; private set; }
public string Description { get; private set; }
public ICollection<UriForGame> Screenshots { get; private set; }
public ICollection<StringForGame> Genres { get; private set; }
}
public sealed class StringForGame : ValueObject
{
public StringForGame(string gameString)
{
GameString = gameString;
}
public string GameString { get; private init; }
public override IEnumerable<object> GetAtomicValues()
{
yield return GameString;
}
}
public abstract class ValueObject : IEquatable<ValueObject>
{
public abstract IEnumerable<object> GetAtomicValues();
public bool Equals(ValueObject? other)
{
return other is not null && ValuesAreEqual(other);
}
public override bool Equals(object? obj)
{
return obj is ValueObject valueObject && ValuesAreEqual(valueObject);
}
public override int GetHashCode()
{
return GetAtomicValues().Aggregate(default(int), HashCode.Combine);
}
private bool ValuesAreEqual(ValueObject other)
{
return GetAtomicValues().SequenceEqual(other.GetAtomicValues());
}
}
我真的不知道问题出在哪里,如果有任何帮助,我将不胜感激.
使用的版本:EF Core 7.0.8