1

このクエリの何が問題なのかわかりません。次のエラーが表示され続けます。

Unable to create a constant value of type 'OvertimeProject.DataCore.tbl_Promotion'. Only primitive types or enumeration types are supported in this context.

これが私のlinqステートメントです:

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE)
{
    using (var Context = new CRMDBEntities())
    {
        var result = (from pro2 in Context.tbl_Promotion
                      where pro2.PromotionDate <= DATE && pro2.DepID==DepID
                      select pro2).ToList();

        var result2 = (from Re in result
                      group Re by Re.StaffID into g2
                      join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID
                      select prop).ToList();

        var result3 = (from s in Context.tbl_STaff
                       join
                       promotion in result2 on s.StaffID equals promotion.StaffID
                       join
                       position in Context.tbl_Position on promotion.PositionID equals position.PositionID
                       select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList();

        return result3;
    }
}

返されたデータを入力したいクラスは次のとおりです。

 public class StaffJoin
 {
     public tbl_STaff Staff { get; set; }
     public tbl_Promotion Promotion { get; set; }
     public tbl_Position Position { get; set; }  
 }

...そして、ここにナビゲートされたプロパティを持つ私のモデル構造があります:

tbl_Staff                  tbl_Promotion                 tbl_Position
---------                 --------------                 -------------
StaffID 0.1                PromotionID               0.1 PositionID
DepID                      PromotionDate                 PositionName
StaffName                 * StaffID                      PositionBase
Chek                       PositionID *                  Avaiilibilty
                           Avilibility
-------                   ---------------               --------------
Navigation                Navigation                    Navigation 
----------                --------------                ----------------
tbl_Department             tbl_Position                  tbl_Promotion
tbl_Promotion              tbl_Staff

私が必要とするのはこれです:

特定の部門のすべてのスタッフと、特定の日付以降の各スタッフ メンバーの最大昇進、および昇進に関連する役職情報

4

1 に答える 1

2

あなたの問題は、あなたのコードが基本的にこのように読めることです...

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE)
{
    using (var Context = new CRMDBEntities())
    {
        List<Promotion> result = (from pro2 in Context.tbl_Promotion
                                where pro2.PromotionDate <= DATE && pro2.DepID==DepID
                                select pro2).ToList();

        List<Promotion> result2 = (from Re in result
                                group Re by Re.StaffID into g2
                                join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID
                                select prop).ToList();

        var result3 = (from s in Context.tbl_STaff
                    join
                    promotion in result2 on s.StaffID equals promotion.StaffID
                    join
                    position in Context.tbl_Position on promotion.PositionID equals position.PositionID
                    select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList();

        return result3;
    }
}

List<Propmotion>result3 では、 LinqToSQL が SQL に変換する必要がある2 つを Linq クエリに入れようとしています。明らかに、SQL は .net ユーザー クラスを処理できないため、失敗します。

ジェフの変更を考慮すると、次のようになります

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE)
{
    using (var Context = new CRMDBEntities())
    {
        IQueryable<Promotion> result = (from pro2 in Context.tbl_Promotion
                                where pro2.PromotionDate <= DATE && pro2.DepID==DepID
                                select pro2);

        IQueryable<Promotion> result2 = (from Re in result
                                group Re by Re.StaffID into g2
                                join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID
                                select prop);

        var result3 = (from s in Context.tbl_STaff
                    join
                    promotion in result2 on s.StaffID equals promotion.StaffID
                    join
                    position in Context.tbl_Position on promotion.PositionID equals position.PositionID
                    select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList();

        return result3;
    }
}

これで、LinqToSQL は IQueryables の処理方法を認識しました。結果と結果2のSQLをサブクエリとしてインライン化するだけです。したがって、違い。

ただし、最後に変更する必要があるのは最後の行です。IQueryable<T>クエリ、まだ行われていない作業を表します。.GetEnumerator()クエリが実際に実行されるのは、呼び出したときです。ただし、それは消費コードでのみ発生し、その時点でCRMDBEntitiesは破棄されます。すっごい.....

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE)
{
    using (var Context = new CRMDBEntities())
    {
        IQueryable<Promotion> result = (from pro2 in Context.tbl_Promotion
                                where pro2.PromotionDate <= DATE && pro2.DepID==DepID
                                select pro2);

        IQueryable<Promotion> result2 = (from Re in result
                                group Re by Re.StaffID into g2
                                join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID
                                select prop);

        var result3 = (from s in Context.tbl_STaff
                    join
                    promotion in result2 on s.StaffID equals promotion.StaffID
                    join
                    position in Context.tbl_Position on promotion.PositionID equals position.PositionID
                    select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList();

        return result3.ToList();
    }
}

またはvarsバックで...

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE)
{
    using (var Context = new CRMDBEntities())
    {
        var result = (from pro2 in Context.tbl_Promotion
                                where pro2.PromotionDate <= DATE && pro2.DepID==DepID
                                select pro2);

        var result2 = (from Re in result
                                group Re by Re.StaffID into g2
                                join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID
                                select prop);

        var result3 = (from s in Context.tbl_STaff
                    join
                    promotion in result2 on s.StaffID equals promotion.StaffID
                    join
                    position in Context.tbl_Position on promotion.PositionID equals position.PositionID
                    select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList();

        return result3.ToList();
    }
}
于 2013-05-09T02:48:17.797 に答える