首页 > 解决方案 > 在 .NET 中替换 IQueryable 查询中的特定对象失败

问题描述

我在 .NET Web API 中有两个用查询语法编写的查询(IQueryable)。他们都返回 DTO 模型。

第一个查询返回具有空文本字段 (ApplicationSettingsto.Text) 的所有对象。第二个查询返回包含文本字段(ApplicationSettingsto.Text)中的一些信息的特定对象。

我的目标是仅替换第一个查询中具有相同 KeyName (query1.DTO.KeyName == query2.DTO.KeyName) 的特定实体,以便我的输出包含一些具有空 TextField 的对象和一些具有 TextField 信息的对象。

我可以为此使用查询语法还是需要更改为方法语法?

在我的 DTO 模型和查询下方:

DTO模型

public class ApplicationSettingsDto
{
    public string KeyName { get; set; }

    // User View
    public string Name { get; set; }

    public int Typ { get; set; }

    // '*' if Node else some value
    public string Wert { get; set; }

    public string Text { get; set; }

    public string DefaultValues { get; set; }

    public bool IsNode { get; set; }

}

查询(IQueryable):

// For simplicity I left out the detailed query
var query1; // returns all DTOs with empty Text Field
var query2; // returns only DTOs which contain Informations in Text Field

// This is the query part I don't understand how to implement
var result; // Should replace the specific objects from query1 with objects from query2 if (query2.Object.KeyName.Equals(query1.Object.KeyName)) 

提前谢谢了 ;)

标签: sql.netlinqapi

解决方案


尽管您没有提及,但我们假设您的查询包含相同类型的元素。所以不是第一个序列包含字符串,第二个序列包含DateTimes.

IQueryable<TSource> query1 = ...
IQueryable<TSource> query2 = ...

因此,如果仅将 query1 中的一些元素替换为 query2 中的元素,那么结果当然也是一个IQueryable<TSource>.

如果 query2 中有多个对象具有相同的 ,您没有指定您想要什么KeyName,更糟糕的是:如果 query1 中也有多个对象具有相同的KeyName

如果查询中的元素之一为 nullObject怎么办?在这种情况下,您不能要求Object.KeyName.

让我们假设所有元素都有一个非 null Object,并且KeyNames都是唯一的。

解决方案是 common 上的 GroupJoin Object.KeyName,如果一个项目中query1有一个或多个 query2 项目具有相同的Object.KeyName,则取其中一个 query2 项目(让我们取第一个,好吗?),如果没有匹配的 q2,则取 q1

var result = query1
    .GroupJoin(query2,             // GroupJoin query1 and query2
        q1 => q1.Object.KeyName,   // from every query1 element take Object.KeyName
        q2 => q2.Object.KeyName,   // from every query2 element take Object.KeyName
        (q1, matchingQ2s) =>       // from every q1 with all its matching q2 objects
                                   // take the first matching q2, or q1 if there is none
            matchingQ2s.FirstOrDefault() ?? q1

  );

简单的来吧您好!


推荐阅读