使用默认值的Linq查询。 如果在DB Table中找不到这个值,则应该从object获取默认值,稍后将在新表中添加新行。
它应该是这样的,但这不起作用:
var name_country = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select new
{
m.name, m.country
}
).DefaultIfEmpty
(
oPerson.name,
oPerson.country
).FirstOrDefault();
如何在DefaultIfEmpty中设置此默认值???
新编辑: 这就是我想要作为一个查询:
string name = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select
m.name
).DefaultIfEmpty
(
oPerson.name,
).FirstOrDefault();
string country = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select
m.country
).DefaultIfEmpty
(
oPerson.country
).FirstOrDefault();
答案 0 :(得分:3)
var name_country = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select new
{
m.name, m.country
}
).DefaultIfEmpty
(new {
oPerson.name,
oPerson.country
}).First();
只要成员布局相同,这将有效 这是有效的,因为匿名类型在运行时是匿名的...请阅读MSDN-entry以获取有关此主题的更多信息:
如果程序集中的两个或多个匿名对象初始值设定项指定了 具有相同顺序且具有相同顺序的属性序列 相同的名称和类型,编译器将对象视为实例 相同的类型。它们共享相同的编译器生成类型 信息。
此外,我宁愿选择??
...
var name_country = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select new
{
m.name,
m.country
}).FirstOrDefault() ?? new {
oPerson.name,
oPerson.country
};
编辑:这是working fiddle
答案 1 :(得分:1)
您正在寻找DefaultIfEmpty
public static IEnumerable<TSource> DefaultIfEmpty<TSource>(
this IEnumerable<TSource> source,
TSource defaultValue
)
您应该创建一个新的匿名对象,设置它的属性,并将其传递给构造函数。
答案 2 :(得分:1)
假设您有Person
类看起来像
public class Person
{
public string Name { get; set; }
public string Country { get; set; }
}
这里你要做的是创建一个Person
的新实例(如果没有从你的数据库查询中返回一个,它会自动设置每个特定属性类型的默认值),例如。
var name_country = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select new Person
{
Name = m.name,
Country = m.country
}).FirstOrDefault() ?? new { oPerson.name, oPerson.country };
刚刚意识到您要默认oPerson
实例中的字段而不是新实例。因此,假设oPerson
也是一个具有完全相同成员结构的匿名对象,您可以这样做
var name_country = (from m in ctx.person
where (m.name == oPerson.name || m.country == oPerson.country)
select new
{
m.name,
m.country
})
.DefaultIfEmpty(aPerson)
.FirstOrDefault();