Tipos anônimos projetados de 3 linq subsônicos, mas não tipos de classe
-
20-09-2019 - |
Pergunta
Sou bastante novo no Subsonic 3/Linq e não sei se estou perdendo algo óbvio, mas acho que encontrei um problema de projeção. Estou tentando executar a consulta mais básica e recuperar os resultados adequados apenas quando uso tipos anônimos. No momento em que troco os tipos anônimos com tipos de classe regulares, recebo todas as propriedades definidas como NULL/ZERO. Estou criando uma biblioteca de classes DAL, então, infelizmente, os tipos anônimos não são uma opção.
Snippet
using System;
using System.Linq;
using Fruits.Data;
namespace FruitTest {
class Program {
static void Main(string[] args) {
var db = new FruitsDB();
var fruits = from f in db.Fruits
select new FruitView {
MyFruitID = f.FruitID,
MyFruitName = f.FruitName,
};
foreach (var f in fruits) {
Console.WriteLine(f.MyFruitID + "\t" + f.MyFruitName);
}
}
}
public class FruitView {
public int MyFruitID { get; set; }
public string MyFruitName { get; set; }
}
}
Portanto, isso não funciona (retorna todos os nulos/zeros)
var fruits = from f in db.Fruits
select new FruitView {
MyFruitID = f.FruitID,
MyFruitName = f.FruitName,
};
Isso funciona como esperado
var fruits = from f in db.Fruits
select new {
MyFruitID = f.FruitID,
MyFruitName = f.FruitName,
};
Meu problema é um pouco semelhante a isto e isto, apenas eu nem estou fazendo junções; Apenas selecionamentos simples.
Qualquer pista será muito apreciada.
Nenhuma solução correta
Outras dicas
Não há resposta real para isso. Eu encontrei isso com mais frequência do que não. Manter a ordem de atribuição igual à ordem de ajuda de leitura. ou seja. no tempo de depuração, se você vir o Querytext e ver em que ordem as colunas são lidas no banco de dados. e depois mantenha a atribuição igual à ordem da instrução SQL Select no Querytext. Resolve o problema 9 das 10 vezes.
Tente isso em vez disso:
IList<FruitView> fruits = (
from f in db.Fruits
select new FruitView {
MyFruitID = f.FruitID,
MyFruitName = f.FruitName
}).ToList();
ou
IQueryable<FruitView> fruits =
from f in db.Fruits
select new FruitView {
MyFruitID = f.FruitID,
MyFruitName = f.FruitName
};
..e foreach
como antes.