替换 .NET 中 IQueryable 查询中的特定对象失败

问题描述 投票:0回答:2

我在 .NET Web API 中有两个用查询语法编写的查询 (

IQueryable<ApplicationSettingsDto>
)。他们都返回 DTO 模型。

第一个查询返回所有带有空文本的对象

Field(ApplicationSettingsto.Text)
。 第二个查询返回特定对象,其中包含文本中的一些信息
Field(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)) 
c# sql .net linq
2个回答
2
投票

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

DateTimes

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

因此,如果你只用query2中的元素替换query1中的一些元素,那么结果当然也是一个

IQueryable<TSource>

如果query2中有多个对象具有相同的

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

如果查询中的某个元素为空

Object
怎么办?在这种情况下,您不能要求
Object.KeyName

假设所有元素都有一个非空

Object
,并且所有
KeyNames
都是唯一的。

解决方案是在公共

Object.KeyName
上进行GroupJoin,如果
query1
中的一个项目有一个或多个具有相同
Object.KeyName
的query2项目,则取其中一个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

  );

简单的comme bonjour!


1
投票

试试这个

var results = query1.ForEachAsync(q1 => 
              {
                 var matchedKeyName = query2.FirstOrDefault(q2 => q2.DTO.KeyName == 
                                                                  q1.DTO.KeyName);
                 if (matchedKeyName != null)
                 {
                     q1.DTO.Text = matchedKeyName.DTO.Text;
                 }
              });
© www.soinside.com 2019 - 2024. All rights reserved.