2015-12-03 37 views
2

我正在构建一个使用实体框架的asp.net mvc应用程序,并试图按列表排序。通过动态更改名称,根据名称存在于数据库中。如何通过实体框架的动态值进行排序?

bids = bids.OrderBy(s => s.PublisherName); 

和对象:

public string PublisherName { get { db.Publishers.Find(pubid).Name; } } 

但我发现了异常:

指定的类型成员 '的PublisherName' 不支持LINQ到实体。仅支持初始化程序,实体成员和实体导航属性。

我该怎么办?我怎样才能使它工作?

谢谢。

回答

3

仅支持初始值设定项,实体成员和实体导航属性 。

db.Publishers.Find(pubid).Name;既不是初始化程序也不是实体成员,也不是导航属性。

一种可能的方式是用AsEnumerable()把它记忆:

bids = bids.AsEnumerable().OrderBy(s => s.PublisherName); 

这只要完美地出价是对象的小单子工作。

+1

只要'出价'已经是过滤(小)对象列表,这是一个好主意。尽管如此,不要这样做:'context.Bids.AsEnumerable()...' –

0

我相信BidPublisher有关系吧?也许这会帮助你

var bids = from t in context.Bids 
      let u = t.Publishers.FirstOrDefault(i => i.Id == pubid) 
      orderby u.Name 
      select t; 

未经测试的代码,不知道它是否适合你!

0

当通过LINQ使用实体框架时,linq语句中的所有属性都被转换为SQL。 EF只能本地理解简单属性。它不理解如何翻译包含实际代码逻辑的属性,这是导致您所看到的错误的原因。解决这个问题的最简单方法是在实体框架之外进行排序客户端。通常的做法是对未排序的结果调用.ToList,然后对产生的列表进行排序,这将发生在客户端。