Linq con DefaultIfEmpty con seleccionar nuevo {}

Consulta de linq con valores por defecto. Si en la tabla de base de datos no se encuentran estos valores, deben tomarse valores predeterminados del objeto, y luego se agregará una nueva fila a esta tabla.

Debería ir así, pero esto no funciona:

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(); 

¿Cómo establecer estos valores predeterminados en DefaultIfEmpty?

Nueva edición: Esto es lo que quiero hacer como una consulta:

 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(); 

 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(); 

Esto funcionará siempre que el diseño del miembro sea idéntico .
Esto funciona, ya que los tipos anónimos son anónimos en tiempo de ejecución … Lea la entrada de MSDN para obtener más información sobre este tema:

Si dos o más inicializadores de objetos anónimos en un ensamblaje especifican una secuencia de propiedades que están en el mismo orden y que tienen los mismos nombres y tipos, el comstackdor trata los objetos como instancias del mismo tipo. Comparten la misma información de tipo generada por el comstackdor.

Además prefiero ir por un ??

 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 }; 

edición: aquí hay un violín de trabajo

Estás buscando esta sobrecarga de DefaultIfEmpty

 public static IEnumerable DefaultIfEmpty( this IEnumerable source, TSource defaultValue ) 

Debe crear un nuevo objeto anónimo , establecer sus propiedades y pasarlo al constructor.

Asumiendo que tienes una clase de Person que parece

 public class Person { public string Name { get; set; } public string Country { get; set; } } 

Lo que desea hacer aquí es crear una nueva instancia de Person (que establecerá automáticamente los valores predeterminados para cada tipo de propiedad en particular) si no se devuelve uno de su consulta de base de datos, por ejemplo

 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 }; 

Acaba de darse cuenta de que desea predeterminar los campos de la instancia de oPerson lugar de una nueva instancia. Entonces, suponiendo que oPerson también es un objeto anónimo con la misma estructura de miembro, podría hacerlo

 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();