Entity framework linq嵌套查询条件顺序依据

Entity framework linq嵌套查询条件顺序依据,entity-framework,linq,ef-code-first,sql-order-by,Entity Framework,Linq,Ef Code First,Sql Order By,我有一个父查询,子查询返回子查询, 我需要根据父对象中的一个属性对子查询进行排序。 以下是sudo代码: from menu in db.Menus orderby menu.Order select new { Title= menu.Title, OrderNumber

我有一个父查询,子查询返回子查询, 我需要根据父对象中的一个属性对子查询进行排序。 以下是sudo代码:

from menu in db.Menus
                     orderby menu.Order
                     select new
                     {
                         Title= menu.Title,
                         OrderNumber = menu.Order,
                         data = (from menuItem in menu.Items
                                  let g = Guid.NewGuid()
                                  orderby g
                                 select new 
                                 {
                                     id = worker.ID,
                                     Title = worker.JobTitle
                                  })
                                 .Take(4)

                     };
这样可以,但我需要对randomNewGuid中的某些菜单进行排序,并对其他菜单按其项目优先级进行排序,比如:

  let g = Guid.NewGuid()
orderby menu.ISRandom ? g: menuItem.Order
但它给出了关于guid和int不匹配的错误。解决方案是什么? 第二:如何用takemenu.size替换take4?
谢谢

您可以通过添加ToString来解决订购问题:


EF LINQ查询中不允许使用TakesomeProperty。这是因为take被转换为TOPx子句,它不可能引用SQL结果中的列。您只能在将结果拉入内存后再执行此操作,而无需获取或获取一些合理的固定最大值。

您似乎希望从菜单项中随机读取四条记录


我认为你最好只是阅读所有的项目,然后在内存中的代码中进行随机选择。

在出现menuItem的情况下,字符串不会导致错误的顺序。顺序是int?是的,很好。我最好把它改成一个有条件构建的OrderBy调用。这在一定程度上取决于orderbymenu是如何实现的。如果是根查询,则条件OrderBy可以是一个选项。对于嵌套,它更复杂-需要LinqKit或类似的工具。我建议相互排斥的OrderBy/ThenBy-类似于OrderBy orderbymenu.ISRandom?Guid.NewGuid:Guid.Empty,orderbymenu.ISRandom?0:menuItem。订单:不错的选择。不过回想起来,我更喜欢在内存中执行此操作。我从不喜欢将数据访问代码与表示问题混为一谈,下一个视图需要按名称排序的项目,等等。。我倾向于将这些东西包装在一个封装了条件排序的视图模型中。什么是orderbymenu?对不起,这是语法错误。更正是orderby menu.IsRandom吗?g:menuItem.Order@GertArnold
let g = Guid.NewGuid().ToString()
orderbymenu.ISRandom ? g : menuItem.Order.ToString()