3

我可以即时将 IQueryable 结果转换为注入的对象吗?

我知道我可以在 Valueinjecter 的帮助下做到这一点:

usercategory uc1 = new usercategory(example);
usercategoryViewData ucVD1 = new usercategoryViewData();
ucVD1.injectFrom(uc1);

所以代替这个:

from u in db.usercategories
where u.id==id
select new usercategoryViewModel {id = u.id, name = u.id, description = u.id};

我想使用类似的东西:

from u in db.usercategories
where u.id==id
select new usercategoryViewModel.InjectFrom(u);    

我有 atm 的另一种选择是循环一个 IEnumerable 并用注入的对象创建一个。

4

2 回答 2

2

在这里,我展示了两种方法:

        public class Foo
        {
            public string Name { get; set; }            
        }

        [Test]
        public void TestMethod1()
        {
            var bars = new[] { new { Name = "aaa" }, new { Name = "bbb" } };
            IEnumerable<Foo> foos = bars.Select(o => new Foo().InjectFrom(o)).Cast<Foo>();

            IEnumerable<Foo> foos2 = from bar in bars
                        select new Foo().InjectFrom(bar) as Foo;

            Assert.AreEqual(bars.First().Name, foos.First().Name);
            Assert.AreEqual(bars.First().Name, foos2.First().Name);
        }
于 2011-01-06T20:14:03.853 回答
0

虽然这可能是可能的,但如果其中有任何复杂性,u我认为这是一个坏主意。

在某些时候,您使用的 ORM(Linq-to-SQL?EF?)需要从在数据库上执行切换到在 .NET 中执行。在那个边界上,它需要从数据库中计算出它需要什么数据。在第一个例子中,这很清楚:它只需要u.id. 在第二种情况下,它不知道:它不知道InjectFrom将从它读取哪些属性,因此它需要从 UserCategories 表中加载所有值,可能还需要加载相关对象,以防万一。

于 2010-12-19T17:54:39.000 回答