[Bug] Can't create Join
От: Holms США  
Дата: 02.11.10 18:30
Оценка: 66 (1)
LINQ

public static byte[] MineralsCategories = new byte[] {4};
...

using (var ctx = DbContext)
{
    var q = from invGroup in ctx.invGroups
                    where MaterialsCategory.Contains(invGroup.categoryID)
                    join invType in ctx.invTypes on invGroup.groupID equals invType.groupID
                    join p2 in ctx.invTypesPrices on invType.typeID equals p2.typeID into invTypePricesInto
                    from invTypePrices in invTypePricesInto.DefaultIfEmpty()
                    where invTypePrices.changeDate ==
                                (from price2 in ctx.invTypesPrices
                                 where price2.typeID == invType.typeID
                                 select price2.changeDate).Max()
                    orderby invType.typeName
                    let r = ShortInvType.I
                        .Init(invType.typeID, invType.typeName, invTypePrices.price)
                    select r;

    return q.ToList();
}

    [TableName(Name="invGroups")]
    public partial class invGroups
    {
        [          PrimaryKey(1)] public short  groupID              { get; set; }
                                  public byte   categoryID           { get; set; }
        [Nullable               ] public string groupName            { get; set; }
        [Nullable               ] public string description          { get; set; }
        [Nullable               ] public int?   iconID               { get; set; }
        [Nullable               ] public bool?  useBasePrice         { get; set; }
        [Nullable               ] public bool?  allowManufacture     { get; set; }
        [Nullable               ] public bool?  allowRecycler        { get; set; }
        [Nullable               ] public bool?  anchored             { get; set; }
        [Nullable               ] public bool?  anchorable           { get; set; }
        [Nullable               ] public bool?  fittableNonSingleton { get; set; }
        [Nullable               ] public bool?  published            { get; set; }
    }
    
    [TableName(Name="invTypes")]
    public partial class invTypes
    {
        [          PrimaryKey(1)] public short    typeID              { get; set; }
        [Nullable               ] public short?   groupID             { get; set; }
        [Nullable               ] public string   typeName            { get; set; }
        [Nullable               ] public string   description         { get; set; }
        [Nullable               ] public int?     graphicID           { get; set; }
        [Nullable               ] public double?  radius              { get; set; }
        [Nullable               ] public double?  mass                { get; set; }
        [Nullable               ] public double?  volume              { get; set; }
        [Nullable               ] public double?  capacity            { get; set; }
        [Nullable               ] public int?     portionSize         { get; set; }
        [Nullable               ] public byte?    raceID              { get; set; }
        [Nullable               ] public decimal? basePrice           { get; set; }
        [Nullable               ] public bool?    published           { get; set; }
        [Nullable               ] public short?   marketGroupID       { get; set; }
        [Nullable               ] public double?  chanceOfDuplicating { get; set; }
        [Nullable               ] public int?     iconID              { get; set; }
    }

    [TableName(Name="invTypesPrices")]
    public partial class invTypesPrices
    {
        [PrimaryKey(1)] public short    typeID     { get; set; }
                        public decimal  price      { get; set; }
        [PrimaryKey(2)] public DateTime changeDate { get; set; }
    }


падает с такой ошибкой
Cant create IN expression.


Call Stack
>    BLToolkit.4.dll!BLToolkit.Data.Sql.SqlQuery.ConvertInListPredicate(BLToolkit.Data.Sql.SqlQuery.Predicate.InList p = {BLToolkit.Data.Sql.SqlQuery.Predicate.InList}) Line 3780    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.SqlQuery.ProcessParameters.AnonymousMethod__2d(BLToolkit.Data.Sql.IQueryElement e = {BLToolkit.Data.Sql.SqlQuery.Predicate.InList}) Line 3751 + 0x30 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.ConvertInternal.AnonymousMethod__9(BLToolkit.Data.Sql.IQueryElement e = {BLToolkit.Data.Sql.SqlQuery.Predicate.InList}) Line 904 + 0x11 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Find(BLToolkit.Data.Sql.IQueryElement element = {BLToolkit.Data.Sql.SqlQuery.Predicate.InList}, System.Func<BLToolkit.Data.Sql.IQueryElement,bool> find = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 336 + 0x1a bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Find(BLToolkit.Data.Sql.IQueryElement element = {BLToolkit.Data.Sql.SqlQuery.Condition}, System.Func<BLToolkit.Data.Sql.IQueryElement,bool> find = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 346 + 0x67 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Find<BLToolkit.Data.Sql.SqlQuery.Condition>(System.Collections.Generic.IEnumerable<BLToolkit.Data.Sql.SqlQuery.Condition> arr = Count = 2, System.Func<BLToolkit.Data.Sql.IQueryElement,bool> find = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 326 + 0xe bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Find(BLToolkit.Data.Sql.IQueryElement element = {BLToolkit.Data.Sql.SqlQuery.SearchCondition}, System.Func<BLToolkit.Data.Sql.IQueryElement,bool> find = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 345 + 0x6c bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Find(BLToolkit.Data.Sql.IQueryElement element = {BLToolkit.Data.Sql.SqlQuery.WhereClause}, System.Func<BLToolkit.Data.Sql.IQueryElement,bool> find = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 351 + 0x5b bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Find(BLToolkit.Data.Sql.IQueryElement element = SQL = "(8) SELECT \r\n\tt8.t7.typeID as typeID, \n\tt8.t7.typeName as typeName, \n\tt8.t10.price as price \nFROM \n\tinvGroups as t2\r\n\t\tINNER JOIN invTypes as t7 ON (t2.groupID = t7.groupID) \r\n\t\tLEFT JOIN invTypesPrices as t10 ON (t7.typeID = t10.typeID) \nWHERE\n\t(t10.changeDate = (15) SELECT \r\n\tt15.Max(t16.changeDate) as c1 \nFROM \n\tinvTypesPrices as t16\nWHERE\n\t(t16.typeID = t7.typeID) ) AND (Convert(SmallInt, t2.categoryID) IN (@parameter[System.Int16[]]))  \nORDER BY \n\tt7.typeName", System.Func<BLToolkit.Data.Sql.IQueryElement,bool> find = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 461 + 0x171 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.ConvertInternal(BLToolkit.Data.Sql.IQueryElement element = SQL = "(8) SELECT \r\n\tt8.t7.typeID as typeID, \n\tt8.t7.typeName as typeName, \n\tt8.t10.price as price \nFROM \n\tinvGroups as t2\r\n\t\tINNER JOIN invTypes as t7 ON (t2.groupID = t7.groupID) \r\n\t\tLEFT JOIN invTypesPrices as t10 ON (t7.typeID = t10.typeID) \nWHERE\n\t(t10.changeDate = (15) SELECT \r\n\tt15.Max(t16.changeDate) as c1 \nFROM \n\tinvTypesPrices as t16\nWHERE\n\t(t16.typeID = t7.typeID) ) AND (Convert(SmallInt, t2.categoryID) IN (@parameter[System.Int16[]]))  \nORDER BY \n\tt7.typeName", System.Func<BLToolkit.Data.Sql.IQueryElement,BLToolkit.Data.Sql.IQueryElement> action = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 902 + 0xbc bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.QueryVisitor.Convert<BLToolkit.Data.Sql.SqlQuery>(BLToolkit.Data.Sql.SqlQuery element = SQL = "(8) SELECT \r\n\tt8.t7.typeID as typeID, \n\tt8.t7.typeName as typeName, \n\tt8.t10.price as price \nFROM \n\tinvGroups as t2\r\n\t\tINNER JOIN invTypes as t7 ON (t2.groupID = t7.groupID) \r\n\t\tLEFT JOIN invTypesPrices as t10 ON (t7.typeID = t10.typeID) \nWHERE\n\t(t10.changeDate = (15) SELECT \r\n\tt15.Max(t16.changeDate) as c1 \nFROM \n\tinvTypesPrices as t16\nWHERE\n\t(t16.typeID = t7.typeID) ) AND (Convert(SmallInt, t2.categoryID) IN (@parameter[System.Int16[]]))  \nORDER BY \n\tt7.typeName", System.Func<BLToolkit.Data.Sql.IQueryElement,BLToolkit.Data.Sql.IQueryElement> action = {Method = {System.Reflection.RuntimeMethodInfo}}) Line 484 + 0xf bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Sql.SqlQuery.ProcessParameters() Line 3736 + 0x83 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.DbManager.GetCommand(BLToolkit.Data.Linq.IQueryContext query = {BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.QueryInfo}) Line 66 + 0x17 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.DbManager.BLToolkit.Data.Linq.IDataContext.SetQuery(BLToolkit.Data.Linq.IQueryContext queryContext = {BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.QueryInfo}) Line 43 + 0xb bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.SetCommand(BLToolkit.Data.Linq.IDataContext dataContext = {EveTyranisDataModel.EveTyranisDataContext}, System.Linq.Expressions.Expression expr = {System.Linq.Expressions.MethodCallExpressionN}, object[] parameters = null, int idx = 0) Line 372 + 0x25 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.Query(BLToolkit.Data.Linq.IDataContextInfo dataContextInfo = {BLToolkit.Data.Linq.DataContextInfo}, System.Linq.Expressions.Expression expr = {System.Linq.Expressions.MethodCallExpressionN}, object[] parameters = null, int queryNumber = 0) Line 333 + 0x38 bytes    C#
     BLToolkit.4.dll!BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.Map(System.Collections.Generic.IEnumerable<System.Data.IDataReader> data = {BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.Query}, BLToolkit.Data.Linq.QueryContext context = {BLToolkit.Data.Linq.QueryContext}, BLToolkit.Data.Linq.IDataContextInfo dataContextInfo = {BLToolkit.Data.Linq.DataContextInfo}, System.Linq.Expressions.Expression expr = {System.Linq.Expressions.MethodCallExpressionN}, object[] ps = null, BLToolkit.Data.Linq.ExpressionInfo<EveManagement.Bussines.Objects.ShortInvType>.Mapper<EveManagement.Bussines.Objects.ShortInvType> mapper = {Method = {System.Reflection.Emit.DynamicMethod.RTDynamicMethod}}) Line 360 + 0x104 bytes    C#
     [External Code]    
     EveManagement.StorageProvider.Sql.dll!EveManagement.StorageProviderSql.SearchPricesForMinerals() Line 132 + 0xd bytes    C#
     EveManagement.UI.exe!EveManagement.UI.Presenters.InvMarketPricePresenter.DoFastFilterMinerals() Line 26 + 0x3e bytes    C#
     EveManagement.UI.exe!EveManagement.UI.Widgets.Market.InvMarketPriceWidget.cmdFastFilterMinerals_ItemClick(object sender = {DevExpress.XtraBars.BarManager}, DevExpress.XtraBars.ItemClickEventArgs e = {DevExpress.XtraBars.ItemClickEventArgs}) Line 95 + 0x10 bytes    C#
     [External Code]    
     EveManagement.UI.exe!EveManagement.UI.Program.Main() Line 27 + 0x3f bytes    C#
     [External Code]


переделал на простой SQL
[SqlQuery(@"
        SELECT it.typeID, it.typeName, itp.price, ig.*
        FROM dbo.invGroups AS ig, dbo.invTypes AS it
        LEFT OUTER JOIN dbo.invTypesPrices AS itp ON itp.typeID = it.typeID
            AND itp.changeDate = (SELECT MAX(itp2.changeDate)
                                                        FROM dbo.invTypesPrices itp2
                                                        WHERE itp2.typeID = it.typeID)
        WHERE ig.groupID = it.groupID
        AND ig.groupID IN (@groupIds)
        ORDER BY it.typeName
        ")]
public abstract List<ShortInvType> GetPricesForGroup(string groupIds);

здесь всё работает нормально.


Мне кажется или этот проект заброшен из-за нехватки времени?
А ведь многие подсели на него конкретно.
Просвятите пожалуйста.

Спасибо
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
The life is relative and reversible.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.