按照有多少相关项目的顺序返回项目列表

时间:2015-07-06 10:30:04

标签: c# linq entity-framework

我想按照有多少相关项目的顺序返回项目列表。

想象一下以下的课程。并想象他们都有DbSets ...... #include <boost/atomic.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> #include <iostream> #include <vector> namespace /*static*/ { boost::atomic<int> data; boost::atomic<int> num_threads_done; struct Work { void signal_slave() { boost::lock_guard<boost::mutex> lock(data_ready_mutex); data_ready = true; cond.notify_all(); } void slave_thread() { static boost::atomic_int _id_gen(0); id = _id_gen++; std::cout << "(" << id << ") slave_thread created\n"; while (true) { boost::unique_lock<boost::mutex> lock(data_ready_mutex); cond.wait(lock, [&]{ return data_ready; }); data_ready = false; data++; num_run++; num_threads_done++; } } private: int id = 0; bool data_ready = false; int num_run = 0; boost::mutex data_ready_mutex; boost::condition_variable cond; }; } #include <boost/chrono.hpp> #include <boost/chrono/chrono_io.hpp> using hrc = boost::chrono::high_resolution_clock; int main() { boost::thread_group tg; size_t nThreads = 10; std::vector<Work> works(nThreads); for (size_t i = 0; i < nThreads; i++) { tg.create_thread(boost::bind(&Work::slave_thread, boost::ref(works[i]))); } while (true) { auto start_time = hrc::now(); for (auto& w : works) w.signal_slave(); std::cout << "Elapsed Time = " << (hrc::now()-start_time) << std::endl; } tg.join_all(); } ...,context.A ...

context.B

我正在尝试按class A { public ID { get; set; } } class B { public virtual A A { get; set; } } 中最相关的顺序获取A个项目列表。查询可能如下所示:

B

我的查询在哪里出错?

1 个答案:

答案 0 :(得分:2)

由于这个原因:

  

我正在尝试按照与B最相关的顺序获取A项目列表。

to from让这个让人很困惑,所以在这个基础上,我会在这个基础上用黑暗刺伤:

IEnumerable<dynamic> GetMostRelatedAs( int numberOfAsToReturn )
{
    var results = this.context.A
        .GroupJoin(
            this.context.B,
            a => a.ID,
            b => b.A.ID,
            (singleA, multipleBs) => new {
                    // this is the projection, so take here what you want
                    numberOfBs = multipleBs.Count(),
                    name = singleA.Name,
                    singleA.ViewCount
                }
            )
        .OrderByDescending(x => x.ViewCount)
        .Take(numberOfAsToReturn)
        .ToList();

        // here you can use automapper to project to a type that you can use
        // So you could add the following method calls after the ToList()
        // .Project(this.mappingEngine)
        // .To<ClassThatRepresentsStructure>()

        // The reason you don't map before the ToList is that you are already doing a projection with that anonymous type.
    return results;
}

<强> 修改

解决意见:

IEnumerable<A> GetMostRelatedAs( int numberOfAsToReturn )
{
    var results = this.context.A
        .GroupJoin(
            this.context.B,
            a => a.ID,
            b => b.A.ID,
            (singleA, multipleBs) => new {
                    // this is the projection, so take here what you want
                    numberOfBs = multipleBs.Count(),
                    name = singleA.Name,
                    singleA.ViewCount,
                    singleA
                }
            )
        .OrderByDescending(x => x.ViewCount)
        .Take(numberOfAsToReturn)
        .ToList()
        .Select(x => x.singleA);

    return results;
}