我在.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))
在此先感谢;)
答案 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;
}
});