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

时间:2018-10-09 08:43:05

标签: sql .net linq api

我在.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; }

}

查询(可查询):

// 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)) 

在此先感谢;)

2 个答案:

答案 0 :(得分:2)

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

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

因此,如果仅将query1中的某些元素替换为query2中的元素,那么结果当然也是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

  );

简单的漫画卓悦!

答案 1 :(得分: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;
                 }
              });