【问题标题】:SubSonic 3 Linq projecting anonymous types but not class typesSubSonic 3 Linq 投影匿名类型但不是类类型
【发布时间】:2009-11-14 12:46:03
【问题描述】:

我对 SubSonic 3/Linq 相当陌生,不知道我是否遗漏了一些明显的东西,但我想我遇到了投影问题。我正在尝试执行最基本的查询,并且只有在使用匿名类型时才能返回正确的结果。当我将匿名类型与常规类类型交换时,我将所有属性设置为空/零。我正在制作一个 DAL 类库,所以很遗憾匿名类型不是一个选项。

片段

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

}

所以这不起作用(返回所有空值/零)

var fruits = from f in db.Fruits
             select new FruitView {
                 MyFruitID = f.FruitID,
                 MyFruitName = f.FruitName,
             };

这按预期工作

var fruits = from f in db.Fruits
             select new {
                 MyFruitID = f.FruitID,
                 MyFruitName = f.FruitName,
             };

我的问题有点类似于thisthis,只是我什至没有做join;只是简单的选择。

任何线索将不胜感激。

【问题讨论】:

  • 顺便说一句,我正在为 Core 和 LinqTemplates 使用最新的 GitHub 位。
  • 是的。这也是我遇到的一个bug。反而很烦人。我得到结果的唯一方法是在结果上使用 ForEach 将它们保存在一个新列表中。
  • @Yogesh:是的,这就是我目前正在使用的解决方法。它的问题是你在这个过程中失去了惰性执行:(
  • 这里有些严重错误。那是您使用的确切代码吗?因为几个流氓逗号暗示了其他情况。
  • cottsak,如果您指的是 f.FruitName 之后的逗号,显然这是有效的语法。我在 T4MVC 的设置文件中看到了这一点。由于编译器似乎忽略了额外的尾随逗号,我觉得把它留在那里很方便。这样所有行都遵循相同的格式,我不必记住总是删除最后一个逗号。我尝试删除它只是为了确保,果然,它没有任何区别。

标签: c# linq subsonic subsonic3 linqtemplates


【解决方案1】:

对此没有真正的答案。我经常遇到这种情况,然后没有。保持作业的顺序与阅读帮助的顺序相同。 IE。如果您看到 QueryText 并查看从 db 读取列的顺序,则在调试时间。然后保持赋值与QueryText中sql Select Statement的顺序相同。 10 次解决问题 9 次。

【讨论】:

    【解决方案2】:

    试试这个:

    IList<FruitView> fruits = (
             from f in db.Fruits
                 select new FruitView {
                     MyFruitID = f.FruitID,
                     MyFruitName = f.FruitName
                 }).ToList();
    

    IQueryable<FruitView> fruits = 
             from f in db.Fruits
                 select new FruitView {
                     MyFruitID = f.FruitID,
                     MyFruitName = f.FruitName
                 };
    

    ..和foreach 和以前一样。

    【讨论】:

    • 感谢 cottsak。我刚刚尝试了你的建议,但不幸的是我仍然得到了两者的空值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2016-08-29
    • 2011-11-07
    • 2012-04-05
    相关资源
    最近更新 更多