2010-12-19 63 views
2

我可以将IQueryable结果即时转换为注入对象吗?Linq使用Valueinjecter选择注入对象

我知道我可以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);  

另一种方法是使用IEnumerable循环,然后用注入的对象创建一个。

+0

你要什么样foos.Select(O =>新的酒吧()InjectFrom(O)。)? – Omu 2011-01-06 19:44:20

回答

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); 
     } 
+0

现在看起来如此明显。谢谢。 – joeriks 2011-01-09 12:44:19

+0

如何将多个结果集合并成一个集合?谢谢。 – Saxman 2012-04-12 23:18:00

+0

@Saxman我认为你必须使用.Union那 – Omu 2012-04-13 06:43:50

0

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

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

+0

是的,但我想要一个简单的/默认的地图名称相同的属性之间。映射器函数的标准任务。为了更复杂,我需要分配一个LoopValueInjection类。当然, – joeriks 2010-12-19 18:42:13