首页 > 解决方案 > 如何使用单个查询来检查两个表中是否存在一个值

问题描述

使用 EF Core 2.2.2,我有这两个简单的查询,目的是确定 aColor是否在CollectionItemorPuzzleColor表中使用:

var isACollectionItem = _applicationDbContext.CollectionItem.Any(collectionItem => collectionItem.ColorId == color.Id);
var isAPuzzleItem = _applicationDbContext.PuzzleColor.Any(puzzleColor => puzzleColor.ColorId == color.Id);
var eitherOr = 
        _applicationDbContext.CollectionItem.Any(collectionItem => collectionItem.ColorId == color.Id)
    ||  _applicationDbContext.PuzzleColor.Any(puzzleColor => puzzleColor.ColorId == color.Id);

前两行生成两个单独的查询,如下所示:

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [CollectionItem] AS [collectionItem]
        WHERE [collectionItem].[ColorId] = @__color_Id_0)
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END

将它们与运算符放在一起||意味着它将在第一个不正确的情况下运行,否则它将只运行第一个查询。

是否可以使用 EF 将两个检查合并到一个查询中?

标签: c#entity-framework-core

解决方案


Color我能够通过使用该表(我的原始帖子中没有包含该表,我的错误)作为起点来获得一个查询:

bool singleQuery = _applicationDbContext.Color
    .Any(myColor =>
            myColor.Id == _applicationDbContext.CollectionItem.FirstOrDefault(collectionItem => collectionItem.ColorId == color.Id).ColorId
        ||  myColor.Id == _applicationDbContext.PuzzleColor.FirstOrDefault(puzzleColor => puzzleColor.ColorId == color.Id).ColorId);

被翻译成:

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [Color] AS [myColor]
        WHERE ([myColor].[Id] = (
            SELECT TOP(1) [collectionItem].[ColorId]
            FROM [CollectionItem] AS [collectionItem]
            WHERE [collectionItem].[ColorId] = @__color_Id_0
        )) OR ([myColor].[Id] = (
            SELECT TOP(1) [puzzleColor].[ColorId]
            FROM [ServedColor] AS [puzzleColor]
            WHERE ([puzzleColor].[Discriminator] = N'PuzzleColor') AND ([puzzleColor].[ColorId] = @__color_Id_1)
        )))
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END

我想可以通过使用联接或联合来创建性能更高的查询


推荐阅读